Skip to content

Commit 49f29e8

Browse files
authored
feat(web): split the parsed résumé into its own 'Profile' tab; rename 'Your CV' → 'Settings' (#1095)
Profile page tabs are now: Settings (upload/edit + delete), Profile (the read-only structured résumé we parse from the CV, previously buried in CV readiness), Market coverage, CV readiness (now just the ATS score + AI review).
1 parent cb25559 commit 49f29e8

1 file changed

Lines changed: 32 additions & 14 deletions

File tree

web/src/routes/my/profile/+page.svelte

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
// independently of the filter-driven reload.
3434
let structured = $state<ResumeStructured | null>(null);
3535
let loadError = $state(false);
36-
let tab = $state<'profile' | 'coverage' | 'readiness'>('profile');
36+
let tab = $state<'settings' | 'structured' | 'coverage' | 'readiness'>('settings');
3737
let modalOpen = $state(false);
3838
let actionError = $state<string | null>(null);
3939
@@ -235,12 +235,21 @@
235235
<div class="flex gap-5 border-b border-border">
236236
<button
237237
type="button"
238-
onclick={() => (tab = 'profile')}
239-
class="-mb-px border-b-2 px-1 pb-2.5 text-sm font-medium transition-colors {tab === 'profile'
238+
onclick={() => (tab = 'settings')}
239+
class="-mb-px border-b-2 px-1 pb-2.5 text-sm font-medium transition-colors {tab === 'settings'
240240
? 'border-brand text-foreground'
241241
: 'border-transparent text-muted-foreground hover:text-foreground'}"
242242
>
243-
Your CV
243+
Settings
244+
</button>
245+
<button
246+
type="button"
247+
onclick={() => (tab = 'structured')}
248+
class="-mb-px border-b-2 px-1 pb-2.5 text-sm font-medium transition-colors {tab === 'structured'
249+
? 'border-brand text-foreground'
250+
: 'border-transparent text-muted-foreground hover:text-foreground'}"
251+
>
252+
Profile
244253
</button>
245254
<button
246255
type="button"
@@ -263,11 +272,11 @@
263272
</div>
264273

265274
<!-- Body -->
266-
{#if tab === 'profile'}
275+
{#if tab === 'settings'}
267276
{#key profile.updated_at}
268277
<ProfileForm {profile} {hasCv} onSaved={handleSaved} onCvUploaded={handleCvUploaded} />
269278
{/key}
270-
<!-- Destructive action lives at the foot of the profile-management tab, out of
279+
<!-- Destructive action lives at the foot of the settings tab, out of
271280
the page header (where it crowded the title on narrow viewports). -->
272281
<div class="mt-2 flex justify-end border-t border-border pt-4">
273282
<Button
@@ -280,32 +289,41 @@
280289
Delete profile
281290
</Button>
282291
</div>
292+
{:else if tab === 'structured'}
293+
<!-- Profile: the read-only structured résumé parsed from the CV. Loaded
294+
independently of the filter-driven reload, so no verdict gate. -->
295+
{#if structured}
296+
<ResumeStructuredView resume={structured} />
297+
{:else}
298+
<div class="flex flex-col items-start gap-2 rounded-xl border border-dashed border-border p-6">
299+
<p class="text-sm font-medium">No parsed profile yet</p>
300+
<p class="text-sm text-muted-foreground">
301+
Upload your CV in the <button type="button" class="font-medium text-foreground underline underline-offset-2" onclick={() => (tab = 'settings')}>Settings</button> tab and we'll parse it into a structured profile.
302+
</p>
303+
</div>
304+
{/if}
283305
{:else if loadError}
284306
<States state="error" message="Couldn't load the report." />
285307
{:else if verdict === null}
286308
<States state="loading" />
287309
{:else if tab === 'coverage'}
288310
<VerdictView {verdict} {gapHref} />
289311
{:else}
290-
<!-- CV readiness: the structured résumé we parsed from the CV (read-only,
291-
omitted when none is current) above the ATS-readiness score. -->
312+
<!-- CV readiness: the ATS-readiness score and the optional AI review. -->
292313
<div class="flex flex-col gap-6">
293-
{#if structured}
294-
<ResumeStructuredView resume={structured} />
295-
{/if}
296314
{#if ats?.has_cv && ats.report}
297315
<div class="flex flex-col gap-5">
298316
{#if reviewUnavailable}
299317
<p class="text-xs text-muted-foreground">AI review is not available right now.</p>
300318
{/if}
301319
<ATSReportView report={ats.report} action={reviewAction} />
302320
</div>
303-
{:else if !structured}
304-
<!-- No CV yet: uploaded via the Your CV tab. -->
321+
{:else}
322+
<!-- No CV yet: uploaded via the Settings tab. -->
305323
<div class="flex flex-col items-start gap-2 rounded-xl border border-dashed border-border p-6">
306324
<p class="text-sm font-medium">Add your CV to score its ATS readiness</p>
307325
<p class="text-sm text-muted-foreground">
308-
Upload your CV in the <button type="button" class="font-medium text-foreground underline underline-offset-2" onclick={() => (tab = 'profile')}>Your CV</button> tab to check ATS readability and this role's keywords.
326+
Upload your CV in the <button type="button" class="font-medium text-foreground underline underline-offset-2" onclick={() => (tab = 'settings')}>Settings</button> tab to check ATS readability and this role's keywords.
309327
</p>
310328
</div>
311329
{/if}

0 commit comments

Comments
 (0)