This commit is contained in:
2026-05-02 06:23:34 +03:30
parent 0466b7dc75
commit f8d1f84ed6
16 changed files with 1934 additions and 369 deletions
@@ -107,6 +107,11 @@ type ParserConfig = {
getItemCount: (plan: unknown) => number;
};
type FertilizationPlanParserPageProps = {
initialTab?: ParserTabKey;
enabledTabs?: ParserTabKey[];
};
const createInitialTabState = (): TabState => ({
message: "",
response: null,
@@ -551,12 +556,22 @@ const PARSER_CONFIGS: Record<ParserTabKey, ParserConfig> = {
},
};
const FertilizationPlanParserPage = () => {
const FertilizationPlanParserPage = ({
initialTab = "fertilization",
enabledTabs = ["fertilization", "irrigation"],
}: FertilizationPlanParserPageProps) => {
const theme = useTheme();
const { farmHub } = useFarmHub();
const farmUuid = farmHub?.farm_uuid;
const availableTabs = enabledTabs.filter(
(tab): tab is ParserTabKey => tab in PARSER_CONFIGS,
);
const resolvedInitialTab = availableTabs.includes(initialTab)
? initialTab
: availableTabs[0] ?? "fertilization";
const singleTabMode = availableTabs.length === 1;
const [activeTab, setActiveTab] = useState<ParserTabKey>("fertilization");
const [activeTab, setActiveTab] = useState<ParserTabKey>(resolvedInitialTab);
const [tabStates, setTabStates] = useState<Record<ParserTabKey, TabState>>({
fertilization: createInitialTabState(),
irrigation: createInitialTabState(),
@@ -907,11 +922,14 @@ const FertilizationPlanParserPage = () => {
variant="h5"
sx={{ fontWeight: 800, mb: 1.5 }}
>
دو جریان هوشمند، یک صفحه واحد
{singleTabMode
? `جریان هوشمند ${config.label}`
: "دو جریان هوشمند، یک صفحه واحد"}
</Typography>
<Typography color="text.secondary">
بین تب آبیاری و تب کودهی جابه جا شو و هر کدام را با
همان flow سوال های تکمیلی تا JSON نهایی پیش ببر.
{singleTabMode
? `ورودی متنی برنامه ${config.label} را بفرست، ابهام ها را کامل کن و خروجی JSON نهایی بگیر.`
: "بین تب آبیاری و تب کودهی جابه جا شو و هر کدام را با همان flow سوال های تکمیلی تا JSON نهایی پیش ببر."}
</Typography>
</Box>
<Stepper
@@ -948,39 +966,45 @@ const FertilizationPlanParserPage = () => {
<CardContent sx={{ p: { xs: 4, md: 5 } }}>
<Stack spacing={4}>
<Box>
<Tabs
value={activeTab}
onChange={(_, value: ParserTabKey) => setActiveTab(value)}
variant="fullWidth"
sx={{
p: 1,
borderRadius: 4,
backgroundColor: alpha(theme.palette.primary.main, 0.05),
minHeight: 64,
"& .MuiTabs-indicator": { display: "none" },
}}
>
{Object.values(PARSER_CONFIGS).map((tabConfig) => (
<Tab
key={tabConfig.key}
value={tabConfig.key}
icon={<i className={tabConfig.icon} />}
iconPosition="start"
label={tabConfig.label}
sx={{
minHeight: 54,
borderRadius: 3,
fontWeight: 700,
transition: "all 0.2s ease",
"&.Mui-selected": {
color: theme.palette.common.white,
background: `linear-gradient(135deg, ${theme.palette.primary.main} 0%, ${theme.palette.info.main} 100%)`,
boxShadow: `0 14px 32px ${alpha(theme.palette.primary.main, 0.24)}`,
},
}}
/>
))}
</Tabs>
{!singleTabMode ? (
<Tabs
value={activeTab}
onChange={(_, value: ParserTabKey) => setActiveTab(value)}
variant="fullWidth"
sx={{
p: 1,
borderRadius: 4,
backgroundColor: alpha(theme.palette.primary.main, 0.05),
minHeight: 64,
"& .MuiTabs-indicator": { display: "none" },
}}
>
{availableTabs.map((tabKey) => {
const tabConfig = PARSER_CONFIGS[tabKey];
return (
<Tab
key={tabConfig.key}
value={tabConfig.key}
icon={<i className={tabConfig.icon} />}
iconPosition="start"
label={tabConfig.label}
sx={{
minHeight: 54,
borderRadius: 3,
fontWeight: 700,
transition: "all 0.2s ease",
"&.Mui-selected": {
color: theme.palette.common.white,
background: `linear-gradient(135deg, ${theme.palette.primary.main} 0%, ${theme.palette.info.main} 100%)`,
boxShadow: `0 14px 32px ${alpha(theme.palette.primary.main, 0.24)}`,
},
}}
/>
);
})}
</Tabs>
) : null}
</Box>
<Box