FPSMS-frontend
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

StockTakeTab.tsx 5.0 KiB

5ヶ月前
2ヶ月前
5ヶ月前
2ヶ月前
2週間前
5ヶ月前
2ヶ月前
2週間前
2ヶ月前
5ヶ月前
2週間前
2ヶ月前
2週間前
5ヶ月前
2ヶ月前
5ヶ月前
2ヶ月前
5ヶ月前
2ヶ月前
2週間前
2ヶ月前
2週間前
2ヶ月前
5ヶ月前
2週間前
2ヶ月前
2週間前
2ヶ月前
2週間前
2ヶ月前
2週間前
2ヶ月前
2週間前
5ヶ月前
2ヶ月前
5ヶ月前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. "use client";
  2. import { Box, Tab, Tabs, Snackbar, Alert } from "@mui/material";
  3. import { useState, useCallback } from "react";
  4. import { useTranslation } from "react-i18next";
  5. import { AllPickedStockTakeListReponse } from "@/app/api/stockTake/actions";
  6. import PickerCardList from "./PickerCardList";
  7. import ApproverCardList from "./ApproverCardList";
  8. import PickerStockTake from "./PickerStockTake";
  9. import PickerReStockTake from "./PickerReStockTake";
  10. import ApproverStockTake from "./ApproverStockTake";
  11. import ApproverAllCardList from "./ApproverAllCardList";
  12. import ApproverStockTakeAll from "./ApproverStockTakeAll";
  13. type ViewScope = "picker" | "approver-by-section" | "approver-all";
  14. const StockTakeTab: React.FC = () => {
  15. const { t } = useTranslation(["inventory", "common"]);
  16. const [tabValue, setTabValue] = useState(0);
  17. const [selectedSession, setSelectedSession] = useState<AllPickedStockTakeListReponse | null>(null);
  18. const [viewMode, setViewMode] = useState<"details" | "reStockTake">("details");
  19. const [viewScope, setViewScope] = useState<ViewScope>("picker");
  20. const [snackbar, setSnackbar] = useState<{
  21. open: boolean;
  22. message: string;
  23. severity: "success" | "error" | "warning"
  24. }>({
  25. open: false,
  26. message: "",
  27. severity: "success",
  28. });
  29. const handleCardClick = useCallback((session: AllPickedStockTakeListReponse) => {
  30. setSelectedSession(session);
  31. setViewMode("details");
  32. }, []);
  33. const handleApproverAllCardClick = useCallback((session: AllPickedStockTakeListReponse) => {
  34. setSelectedSession(session);
  35. setViewMode("details");
  36. setViewScope("approver-all");
  37. }, []);
  38. const handleReStockTakeClick = useCallback((session: AllPickedStockTakeListReponse) => {
  39. setSelectedSession(session);
  40. setViewMode("reStockTake");
  41. setViewScope("picker");
  42. }, []);
  43. const handleBackToList = useCallback(() => {
  44. setSelectedSession(null);
  45. setViewMode("details");
  46. }, []);
  47. const handleSnackbar = useCallback((message: string, severity: "success" | "error" | "warning") => {
  48. setSnackbar({
  49. open: true,
  50. message,
  51. severity,
  52. });
  53. }, []);
  54. if (selectedSession) {
  55. return (
  56. <Box>
  57. {viewScope === "picker" && (
  58. tabValue === 0 ? (
  59. viewMode === "reStockTake" ? (
  60. <PickerReStockTake
  61. selectedSession={selectedSession}
  62. onBack={handleBackToList}
  63. onSnackbar={handleSnackbar}
  64. />
  65. ) : (
  66. <PickerStockTake
  67. selectedSession={selectedSession}
  68. onBack={handleBackToList}
  69. onSnackbar={handleSnackbar}
  70. />
  71. )
  72. ) : null
  73. )}
  74. {viewScope === "approver-by-section" && tabValue === 1 && (
  75. <ApproverStockTake
  76. selectedSession={selectedSession}
  77. onBack={handleBackToList}
  78. onSnackbar={handleSnackbar}
  79. />
  80. )}
  81. {viewScope === "approver-all" && tabValue === 2 && (
  82. <ApproverStockTakeAll
  83. selectedSession={selectedSession}
  84. onBack={handleBackToList}
  85. onSnackbar={handleSnackbar}
  86. />
  87. )}
  88. <Snackbar
  89. open={snackbar.open}
  90. autoHideDuration={6000}
  91. onClose={() => setSnackbar({ ...snackbar, open: false })}
  92. >
  93. <Alert onClose={() => setSnackbar({ ...snackbar, open: false })} severity={snackbar.severity}>
  94. {snackbar.message}
  95. </Alert>
  96. </Snackbar>
  97. </Box>
  98. );
  99. }
  100. return (
  101. <Box>
  102. <Tabs
  103. value={tabValue}
  104. onChange={(e, newValue) => {
  105. setTabValue(newValue);
  106. if (newValue === 0) {
  107. setViewScope("picker");
  108. } else if (newValue === 1) {
  109. setViewScope("approver-by-section");
  110. } else {
  111. setViewScope("approver-all");
  112. }
  113. }}
  114. sx={{ mb: 2 }}
  115. >
  116. <Tab label={t("Picker")} />
  117. <Tab label={t("Approver")} />
  118. <Tab label={t("Approver All")} />
  119. </Tabs>
  120. {tabValue === 0 && (
  121. <PickerCardList
  122. onCardClick={(session) => {
  123. setViewScope("picker");
  124. handleCardClick(session);
  125. }}
  126. onReStockTakeClick={handleReStockTakeClick}
  127. />
  128. )}
  129. {tabValue === 1 && (
  130. <ApproverCardList
  131. onCardClick={(session) => {
  132. setViewScope("approver-by-section");
  133. handleCardClick(session);
  134. }}
  135. />
  136. )}
  137. {tabValue === 2 && (
  138. <ApproverAllCardList
  139. onCardClick={handleApproverAllCardClick}
  140. />
  141. )}
  142. <Snackbar
  143. open={snackbar.open}
  144. autoHideDuration={6000}
  145. onClose={() => setSnackbar({ ...snackbar, open: false })}
  146. >
  147. <Alert onClose={() => setSnackbar({ ...snackbar, open: false })} severity={snackbar.severity}>
  148. {snackbar.message}
  149. </Alert>
  150. </Snackbar>
  151. </Box>
  152. );
  153. };
  154. export default StockTakeTab;