fix(ux): preserve localized save errors and current language retries

This commit is contained in:
cesnimda
2026-10-11 03:05:33 +02:00
parent a94ea0a4a4
commit c135d03602
15 changed files with 485 additions and 11 deletions
@@ -39,6 +39,7 @@ export default function CompaniesTable() {
const location = useLocation();
const navigate = useNavigate();
const [editOpen, setEditOpen] = useState(false);
const [editError, setEditError] = useState("");
const [editing, setEditing] = useState<Company | null>(null);
const [relationshipOpen, setRelationshipOpen] = useState(false);
const [relationshipLoading, setRelationshipLoading] = useState(false);
@@ -78,6 +79,7 @@ export default function CompaniesTable() {
}, [companies, location.pathname, location.search, navigate]);
const openEdit = (c: Company) => {
setEditError("");
setEditing(c);
setRecruiterName(c.recruiterName ?? "");
setRecruiterEmail(c.recruiterEmail ?? "");
@@ -104,6 +106,7 @@ export default function CompaniesTable() {
const save = async () => {
if (!editing?.id) return;
setEditError("");
try {
const res = await api.put<Company>(`/companies/${editing.id}`, {
name: editing.name,
@@ -122,7 +125,7 @@ export default function CompaniesTable() {
setEditOpen(false);
setEditing(null);
} catch (error) {
toast(getApiErrorMessage(error, t("companiesUpdateFailed")), "error");
setEditError(getApiErrorMessage(error, t("companiesUpdateFailed")));
}
};
@@ -166,7 +169,7 @@ export default function CompaniesTable() {
{renderCompanyMeta(t("companiesSource"), c.source)}
{renderCompanyMeta(t("companiesPipeline"), c.pipelineStage)}
{renderCompanyMeta(t("companiesRecruiter"), [c.recruiterName, c.recruiterEmail].filter(Boolean).join(" · "))}
{renderCompanyMeta(t("companiesNextContact"), c.nextContactAt ? new Date(c.nextContactAt).toLocaleDateString() : null)}
{renderCompanyMeta(t("companiesNextContact"), c.nextContactAt ? new Date(c.nextContactAt).toLocaleDateString(language === "nb" ? "nb-NO" : "en") : null)}
</Box>
</Stack>
</Paper>
@@ -202,7 +205,7 @@ export default function CompaniesTable() {
{c.recruiterName ?? ""}
{c.recruiterEmail ? ` (${c.recruiterEmail})` : ""}
</TableCell>
<TableCell>{c.nextContactAt ? new Date(c.nextContactAt).toLocaleDateString() : ""}</TableCell>
<TableCell>{c.nextContactAt ? new Date(c.nextContactAt).toLocaleDateString(language === "nb" ? "nb-NO" : "en") : ""}</TableCell>
<TableCell align="right">
<IconButton size="small" aria-label={`${t("companiesRelationship")}: ${c.name}`} onClick={() => void openRelationship(c)}>
<PeopleAltOutlinedIcon fontSize="small" />
@@ -231,6 +234,7 @@ export default function CompaniesTable() {
<Dialog open={editOpen} onClose={() => setEditOpen(false)} fullWidth fullScreen={isMobile} maxWidth="sm">
<DialogTitle>{t("companiesEdit")}</DialogTitle>
<DialogContent>
{editError ? <Alert severity="error" sx={{ mt: 1 }}>{editError}</Alert> : null}
<Box sx={{ display: "grid", gridTemplateColumns: { xs: "1fr", md: "1fr 1fr" }, gap: 2, mt: 1 }}>
<TextField
label={t("companiesName")}
+2 -2
View File
@@ -517,7 +517,7 @@ export default function JobTable({ refreshToken, pageSize, onPageSizeChange, col
<InputLabel id="job-table-company-label">{t("jobTableCompany")}</InputLabel>
<Select labelId="job-table-company-label" value={companyFilterId} label={t("jobTableCompany")} onChange={(e) => changeCompany(e.target.value as number | "All")}>
<MenuItem value="All">{t("jobTableAll")}</MenuItem>
{selectedCompanyIsLoading ? <MenuItem value={companyFilterId}>Company {companyFilterId}</MenuItem> : null}
{selectedCompanyIsLoading ? <MenuItem value={companyFilterId}>{t("jobTableCompany")} {companyFilterId}</MenuItem> : null}
{companies.map((c) => <MenuItem key={c.id} value={c.id}>{c.name}</MenuItem>)}
</Select>
</FormControl>
@@ -598,7 +598,7 @@ export default function JobTable({ refreshToken, pageSize, onPageSizeChange, col
<InputLabel id="job-table-company-label">{t("jobTableCompany")}</InputLabel>
<Select labelId="job-table-company-label" value={companyFilterId} label={t("jobTableCompany")} onChange={(e) => changeCompany(e.target.value as number | "All")}>
<MenuItem value="All">{t("jobTableAll")}</MenuItem>
{selectedCompanyIsLoading ? <MenuItem value={companyFilterId}>Company {companyFilterId}</MenuItem> : null}
{selectedCompanyIsLoading ? <MenuItem value={companyFilterId}>{t("jobTableCompany")} {companyFilterId}</MenuItem> : null}
{companies.map((c) => <MenuItem key={c.id} value={c.id}>{c.name}</MenuItem>)}
</Select>
</FormControl>