|
- "use client";
-
- import React, { useState, useEffect } from "react";
- import { useTranslation } from "react-i18next";
- import { BomWeightingScoreResult } from "@/app/api/settings/bomWeighting";
- import { fetchBomWeightingScoresClient } from "@/app/api/settings/bomWeighting/client";
- import type { BomScoreResult } from "@/app/api/bom";
- import { fetchBomScoresClient } from "@/app/api/bom/client";
- import BomWeightingScoreTable from "@/components/BomWeightingScoreTable";
- import BomScoreTable from "@/components/BomScoreTable";
- import Tabs from "@mui/material/Tabs";
- import Tab from "@mui/material/Tab";
- import Box from "@mui/material/Box";
- import Paper from "@mui/material/Paper";
-
- interface Props {
- bomWeightingScores: BomWeightingScoreResult[];
- }
-
- const BomWeightingTabs: React.FC<Props> = ({ bomWeightingScores: initialBomWeightingScores }) => {
- const { t } = useTranslation("common");
- const [tab, setTab] = useState(0);
- const [bomWeightingScores, setBomWeightingScores] = useState<BomWeightingScoreResult[]>(initialBomWeightingScores);
- const [bomScores, setBomScores] = useState<BomScoreResult[] | null>(null);
- const [loadingScores, setLoadingScores] = useState(false);
- const [loadError, setLoadError] = useState<string | null>(null);
-
- const loadBomScores = React.useCallback(async () => {
- try {
- setLoadingScores(true);
- setLoadError(null);
- console.log("Fetching BOM scores from /bom/scores...");
- const data = await fetchBomScoresClient();
- console.log("BOM scores received:", data);
- setBomScores(data || []);
- } catch (err: any) {
- console.error("Failed to load BOM scores:", err);
- const errorMsg =
- err?.response?.data?.message || err?.message || t("Update Failed") || "Load failed";
- setLoadError(errorMsg);
- setBomScores([]);
- } finally {
- setLoadingScores(false);
- }
- }, [t]);
-
- const loadBomWeightingScores = React.useCallback(async () => {
- try {
- console.log("Fetching BOM weighting scores...");
- const data = await fetchBomWeightingScoresClient();
- console.log("BOM weighting scores received:", data);
- setBomWeightingScores(data || []);
- } catch (err: any) {
- console.error("Failed to load BOM weighting scores:", err);
- }
- }, []);
-
- const handleWeightingUpdated = React.useCallback(async () => {
- // Refresh both weighting scores and BOM scores
- await Promise.all([
- loadBomWeightingScores(),
- loadBomScores()
- ]);
- }, [loadBomWeightingScores, loadBomScores]);
-
- // Sync initial prop values
- useEffect(() => {
- setBomWeightingScores(initialBomWeightingScores);
- }, [initialBomWeightingScores]);
-
- useEffect(() => {
- if (tab !== 1) return;
- void loadBomScores();
- }, [tab, loadBomScores]);
-
- return (
- <>
- <Paper
- variant="outlined"
- sx={{
- mb: 2,
- borderBottomLeftRadius: 0,
- borderBottomRightRadius: 0,
- }}
- >
- <Tabs
- value={tab}
- onChange={(_, v) => setTab(v)}
- indicatorColor="primary"
- textColor="primary"
- sx={{
- pl: 2,
- minHeight: 44,
- }}
- >
- <Tab
- label={t("Material Weighting")}
- value={0}
- sx={{ textTransform: "none", fontSize: 16, px: 3, minHeight: 44 }}
- />
- <Tab
- label={t("Material Score")}
- value={1}
- sx={{ textTransform: "none", fontSize: 16, px: 3, minHeight: 44 }}
- />
- </Tabs>
- </Paper>
-
- <Box>
- {tab === 0 && (
- <BomWeightingScoreTable
- bomWeightingScores={bomWeightingScores}
- onWeightingUpdated={handleWeightingUpdated}
- />
- )}
- {tab === 1 && (
- loadingScores ? (
- <Paper
- variant="outlined"
- sx={{
- p: 3,
- borderTopLeftRadius: 0,
- borderTopRightRadius: 0,
- }}
- >
- <div className="text-slate-700">{t("Loading")}</div>
- </Paper>
- ) : loadError ? (
- <Paper
- variant="outlined"
- sx={{
- p: 3,
- borderTopLeftRadius: 0,
- borderTopRightRadius: 0,
- }}
- >
- <div className="text-slate-700 text-red-600">{loadError}</div>
- </Paper>
- ) : bomScores && bomScores.length > 0 ? (
- <BomScoreTable boms={bomScores} />
- ) : (
- <Paper
- variant="outlined"
- sx={{
- p: 3,
- borderTopLeftRadius: 0,
- borderTopRightRadius: 0,
- }}
- >
- <div className="text-slate-700">{t("No data available")}</div>
- </Paper>
- )
- )}
- </Box>
- </>
- );
- };
-
- export default BomWeightingTabs;
|