feat(cv): harden multi-page builder
CI and Deploy / test (pull_request) Failing after 3m0s
CI and Deploy / deploy (pull_request) Has been skipped

Wrap pathological content, paginate oversized entries, measure A4 and Letter previews correctly, unify section ordering, and gate stored-output actions on saved state.
This commit is contained in:
cesnimda
2026-08-15 14:09:51 +02:00
parent d424633f95
commit 5203ddea72
19 changed files with 508 additions and 206 deletions
+10 -1
View File
@@ -12,10 +12,12 @@ import PublicIcon from "@mui/icons-material/Public";
import { getApiErrorMessage } from "../api";
import { useToast } from "../toast";
import { CvVariantSummary, cvBuilderApi, emptyCvVariantSettings } from "../cvBuilder";
import { useDialogActions } from "../dialogs";
export default function CvBuilderPage() {
const navigate = useNavigate();
const { toast } = useToast();
const { confirmAction } = useDialogActions();
const [variants, setVariants] = useState<CvVariantSummary[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
@@ -56,6 +58,13 @@ export default function CvBuilderPage() {
};
const remove = async (id: number) => {
const variant = variants.find((item) => item.id === id);
setMenu(null);
if (!(await confirmAction(`Delete "${variant?.name ?? "this CV"}" and its saved version history?`, {
title: "Delete CV",
confirmLabel: "Delete CV",
destructive: true,
}))) return;
try {
await cvBuilderApi.remove(id);
setVariants((v) => v.filter((x) => x.id !== id));
@@ -93,7 +102,7 @@ export default function CvBuilderPage() {
<Paper key={v.id} sx={{ p: 2, borderRadius: 4, cursor: "pointer", "&:hover": { boxShadow: 4 } }} onClick={() => navigate(`/career/builder/${v.id}`)}>
<Stack direction="row" alignItems="flex-start" justifyContent="space-between">
<Typography sx={{ fontWeight: 800 }}>{v.name}</Typography>
<IconButton size="small" onClick={(e) => { e.stopPropagation(); setMenu({ anchor: e.currentTarget, id: v.id }); }}>
<IconButton size="small" aria-label={`Actions for ${v.name}`} onClick={(e) => { e.stopPropagation(); setMenu({ anchor: e.currentTarget, id: v.id }); }}>
<MoreVertIcon fontSize="small" />
</IconButton>
</Stack>