feat(cv): redesign document editing with revision-safe letters and writing tools

This commit is contained in:
cesnimda
2026-10-25 22:44:14 +01:00
parent 01e10996c5
commit 2bfaf6c14b
57 changed files with 2859 additions and 118 deletions
+16 -2
View File
@@ -258,6 +258,16 @@ export type CoverLetter = {
currentVersion: number;
versions: CoverLetterVersion[];
aiSuggestionCount: number;
documentSettings?: CoverLetterDocumentSettings;
};
export type CoverLetterDocumentSettings = {
schemaVersion: 1;
senderName: string; senderTitle: string; senderEmail: string; senderPhone: string; senderLocation: string;
recipient: string; subject: string; date: string;
themeId: string; accentColor: string; bodyFont: string;
baseFontSizePt: number; lineHeight: number; pageMarginMm: number; pageSize: string;
sourceCvId?: number | null;
};
export type SubmittedPackageAttachment = {
@@ -297,8 +307,12 @@ export const applicationAssetsApi = {
api.get<TailoringPlan>(`/jobapplications/${jobId}/tailoring`).then((r) => r.data),
coverLetter: (jobId: number) =>
api.get<CoverLetter>(`/jobapplications/${jobId}/cover-letter`).then((r) => r.data),
saveCoverLetter: (jobId: number, text: string, expectedVersion: number, source = "manual", aiAction?: string) =>
api.put<CoverLetter>(`/jobapplications/${jobId}/cover-letter`, { text, source, aiAction, expectedVersion }).then((r) => r.data),
saveCoverLetter: (jobId: number, text: string, expectedVersion: number, source = "manual", aiAction?: string, documentSettings?: CoverLetterDocumentSettings) =>
api.put<CoverLetter>(`/jobapplications/${jobId}/cover-letter`, { text, source, aiAction, expectedVersion, ...(documentSettings ? { documentSettings } : {}) }).then((r) => r.data),
previewCoverLetter: (jobId: number, text: string, documentSettings: CoverLetterDocumentSettings) =>
api.post<{ html: string; themeId: string; suggestedFileName: string }>(`/jobapplications/${jobId}/cover-letter/preview`, { text, documentSettings }).then(r => r.data),
exportCoverLetter: (jobId: number, expectedVersion: number) =>
api.post<Blob>(`/jobapplications/${jobId}/cover-letter/export-pdf?expectedVersion=${expectedVersion}`, undefined, { responseType: "blob" }).then(r => r.data),
restoreCoverLetter: (jobId: number, version: number, expectedVersion: number) =>
api.post<CoverLetter>(`/jobapplications/${jobId}/cover-letter/versions/${version}/restore`, { expectedVersion }).then((r) => r.data),
submittedPackages: (jobId: number) =>