FPSMS-frontend
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 

167 satır
5.0 KiB

  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;