Files
hounam-submit-form-frontend/ui/forms/LanguageForm.tsx
2026-05-31 14:22:39 +03:30

162 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React from "react";
import { Box, MenuItem, Paper, TextField } from "@mui/material";
type ProficiencyLevel =
| ""
| "NONE"
| "VERY_WEAK"
| "WEAK"
| "AVERAGE"
| "GOOD"
| "VERY_GOOD"
| "EXCELLENT";
const proficiencyOptions: { value: ProficiencyLevel; label: string }[] = [
{ value: "", label: "انتخاب ..." },
{ value: "NONE", label: "ندارد" },
{ value: "VERY_WEAK", label: "خیلی ضعیف" },
{ value: "WEAK", label: "ضعیف" },
{ value: "AVERAGE", label: "متوسط" },
{ value: "GOOD", label: "خوب" },
{ value: "VERY_GOOD", label: "خیلی خوب" },
{ value: "EXCELLENT", label: "عالی" },
];
export interface LanguageSkillsUIData {
englishLevel: ProficiencyLevel;
englishDescription: string;
englishCertificate: string;
arabicLevel: ProficiencyLevel;
arabicDescription: string;
otherLanguagesDescription: string;
dialectsDescription: string;
otherSkills: string;
}
interface Props {
value: LanguageSkillsUIData;
onChange: (next: LanguageSkillsUIData) => void;
}
export default function LanguageSkillsForm({ value, onChange }: Props) {
const setField = (field: keyof LanguageSkillsUIData) => (e: React.ChangeEvent<HTMLInputElement>) => {
onChange({ ...value, [field]: e.target.value });
};
return (
<Paper
elevation={0}
sx={{
p: { xs: 2, md: 3 },
borderRadius: "24px",
border: "1px solid #e2e8f0",
backgroundColor: "#fff",
}}
>
<Box
sx={{
display: "grid",
gridTemplateColumns: { xs: "1fr", md: "1fr 1fr" },
gap: 2,
}}
>
{/* زبان انگلیسی */}
<TextField
select
fullWidth
label="زبان انگلیسی*"
value={value.englishLevel}
onChange={setField("englishLevel")}
>
{proficiencyOptions.map((o) => (
<MenuItem key={o.value} value={o.value}>
{o.label}
</MenuItem>
))}
</TextField>
<TextField
fullWidth
label="مدرک معتبر زبان انگلیسی"
value={value.englishCertificate}
onChange={setField("englishCertificate")}
placeholder="مثلاً IELTS / TOEFL / MSRT / ..."
/>
<TextField
fullWidth
multiline
minRows={2}
label="توضیحات"
value={value.englishDescription}
onChange={setField("englishDescription")}
sx={{ gridColumn: { xs: "1", md: "1 / -1" } }}
/>
{/* زبان عربی */}
<TextField
select
fullWidth
label="زبان عربی*"
value={value.arabicLevel}
onChange={setField("arabicLevel")}
>
{proficiencyOptions.map((o) => (
<MenuItem key={o.value} value={o.value}>
{o.label}
</MenuItem>
))}
</TextField>
<Box /> {/* برای حفظ چینش دو ستونه */}
<TextField
fullWidth
multiline
minRows={2}
label="توضیحات"
value={value.arabicDescription}
onChange={setField("arabicDescription")}
sx={{ gridColumn: { xs: "1", md: "1 / -1" } }}
/>
{/* سایر زبان‌ها */}
<TextField
fullWidth
multiline
minRows={2}
label="سایر زبان ها (توضیحات در مورد میزان تسلط)"
value={value.otherLanguagesDescription}
onChange={setField("otherLanguagesDescription")}
sx={{ gridColumn: { xs: "1", md: "1 / -1" } }}
/>
{/* گویش‌ها و لهجه‌ها */}
<TextField
fullWidth
multiline
minRows={2}
label="آشنایی با گویش ها و لهجه های کشور (توضیحات در مورد میزان تسلط)"
value={value.dialectsDescription}
onChange={setField("dialectsDescription")}
sx={{ gridColumn: { xs: "1", md: "1 / -1" } }}
/>
{/* سایر مهارت‌ها */}
<TextField
fullWidth
multiline
minRows={3}
label="سایر مهارت ها (اعم از ورزشی، هنری، فرهنگی، اجتماعی و ...)"
value={value.otherSkills}
onChange={setField("otherSkills")}
sx={{ gridColumn: { xs: "1", md: "1 / -1" } }}
/>
</Box>
</Paper>
);
}