Polish UI, harden company creation, and add error pages

This commit is contained in:
cesnimda
2026-03-23 19:34:29 +01:00
parent 8f5eab2fe4
commit fcafda6f52
38 changed files with 2293 additions and 1269 deletions
@@ -26,6 +26,7 @@ import { useDialogActions } from "../dialogs";
import Correspondence from "./Correspondence";
import Attachments from "./Attachments";
import JobFlowBar from "./JobFlowBar";
import { useI18n } from "../i18n/I18nProvider";
type FollowUpDraft = {
subject: string;
@@ -70,6 +71,7 @@ function copyLines(items: string[]) {
export default function JobDetailsDialog({ open, jobId, onClose }: Props) {
const { toast } = useToast();
const { t } = useI18n();
const { confirmAction } = useDialogActions();
const [job, setJob] = useState<JobApplication | null>(null);
@@ -152,7 +154,7 @@ export default function JobDetailsDialog({ open, jobId, onClose }: Props) {
}
})();
const title = job ? `${job.company?.name ?? ""} - ${job.jobTitle}` : "Job Application";
const title = job ? `${job.company?.name ?? ""} - ${job.jobTitle}` : t("addJobApplication");
const checklist = [job?.hasResume ? "Resume" : null, job?.hasCoverLetter ? "Cover letter" : null, job?.hasPortfolio ? "Portfolio" : null, job?.hasOtherAttachment ? "Other" : null].filter(Boolean).join(", ") || "";
const summaryFirstText = job?.fullSummary ?? job?.shortSummary ?? "No summary yet.";
const translatedDescriptionText = job?.translatedDescription?.trim() || "";
@@ -166,7 +168,7 @@ export default function JobDetailsDialog({ open, jobId, onClose }: Props) {
<DialogTitle sx={{ pb: 1 }}>
<Box sx={{ display: "flex", alignItems: "center", justifyContent: "space-between", gap: 2, flexWrap: "wrap" }}>
<Box>
<Typography variant="overline" sx={{ color: "text.secondary" }}>Job workspace</Typography>
<Typography variant="overline" sx={{ color: "text.secondary" }}>{t("jobTableOpen")}</Typography>
<Typography variant="h6">{title}</Typography>
</Box>
{job && <Chip label={job.status} color={statusChipColor(job.status)} size="small" />}
@@ -179,14 +181,14 @@ export default function JobDetailsDialog({ open, jobId, onClose }: Props) {
<Typography variant="body2" sx={{ color: "text.secondary" }}>{summaryFirstText}</Typography>
</Box>
<Tabs value={tab} onChange={(_, v) => setTab(v)} sx={{ mb: 2 }} variant="scrollable" allowScrollButtonsMobile>
<Tab label="Overview" />
<Tab label={t("jobTableOverview")} />
<Tab label="Correspondence" />
<Tab label="Attachments" />
<Tab label="Tailored CV" />
<Tab label="Follow-up draft" />
<Tab label={t("jobTableFollowUp")} />
<Tab label="Candidate fit" />
<Tab label="Interview prep" />
<Tab label="Readiness" />
<Tab label={t("jobTableReadiness")} />
{isAdmin ? <Tab label="History" /> : null}
</Tabs>