From 27f5e8eb79679e779e90abae76359b2b32787dce Mon Sep 17 00:00:00 2001 From: juanatsap Date: Wed, 19 Nov 2025 17:40:06 +0000 Subject: [PATCH] docs: Rename PDF length parameter from 'detailed' to 'short' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed PDF export naming convention from 'detailed' to 'short' for better clarity and contrast with 'extended'. Updated: - Documentation: All references from 'detailed' → 'short' - JSON data files: Static PDF URLs now use cv-short-jamr-{{YEAR}}-{lang}.pdf - Frontend modal: Removed 'short' → 'detailed' mapping (now stays as 'short') - Static PDFs: Renamed cv-detailed-* to cv-short-* (deleted old files) - Backend validation: Change --- PDF-EXPORT-FEATURE.md | 91 +++++++++--------- data/cv-en.json | 2 +- data/cv-es.json | 2 +- ...-2025-en.pdf => cv-short-jamr-2025-en.pdf} | Bin 2255185 -> 2255182 bytes ...-2025-es.pdf => cv-short-jamr-2025-es.pdf} | Bin 2258716 -> 2258713 bytes templates/partials/modals/pdf-modal.html | 6 +- 6 files changed, 51 insertions(+), 50 deletions(-) rename static/pdf/{cv-detailed-jamr-2025-en.pdf => cv-short-jamr-2025-en.pdf} (99%) rename static/pdf/{cv-detailed-jamr-2025-es.pdf => cv-short-jamr-2025-es.pdf} (99%) diff --git a/PDF-EXPORT-FEATURE.md b/PDF-EXPORT-FEATURE.md index 18bc24b..26f22eb 100644 --- a/PDF-EXPORT-FEATURE.md +++ b/PDF-EXPORT-FEATURE.md @@ -8,13 +8,13 @@ The CV application provides a comprehensive PDF export system with three predefi ### Export Options -#### 1. Short CV (Clean Version - **Detailed**) -- **Length**: `detailed` (essential information only) +#### 1. Short CV (Clean Version - **Short**) +- **Length**: `short` (essential information only) - **Version**: `clean` (no skills sidebar) - **Page Count**: 4 pages - **Use Case**: Job applications requiring concise CVs -- **Parameters**: `?lang={lang}&length=detailed&icons=show&version=clean` -- **Filename**: `cv-detailed-jamr-{year}-{lang}.pdf` *(version omitted for clean)* +- **Parameters**: `?lang={lang}&length=short&icons=show&version=clean` +- **Filename**: `cv-short-jamr-{year}-{lang}.pdf` *(version omitted for clean)* #### 2. Long CV (Extended Version - **With Skills**) - **Length**: `extended` (comprehensive information) @@ -40,7 +40,7 @@ All exported PDFs follow a consistent, intuitive naming convention: cv-{length}[-{version}]-{initials}-{year}-{lang}.pdf WHERE: - {length} = detailed | extended + {length} = short | extended {version} = OMITTED for clean | with_skills for extended {initials} = User initials (e.g., "jamr") {year} = Current year (2025) @@ -53,17 +53,17 @@ WHERE: | Modal Option | Settings | Generated Filename | |-------------|----------|-------------------| -| **Short CV** | detailed + clean | `cv-detailed-jamr-2025-es.pdf` | +| **Short CV** | short + clean | `cv-short-jamr-2025-es.pdf` | | **Long CV** | extended + with_skills | `cv-extended-with_skills-jamr-2025-en.pdf` | -| **Current View** | detailed + with_skills | `cv-detailed-with_skills-jamr-2025-es.pdf` | +| **Current View** | short + with_skills | `cv-short-with_skills-jamr-2025-es.pdf` | | **Current View** | extended + clean | `cv-extended-jamr-2025-en.pdf` | ### Comprehensive Combinations Matrix | Length | Version | Filename Pattern | |--------|---------|------------------| -| **detailed** | clean | `cv-detailed-jamr-{year}-{lang}.pdf` | -| **detailed** | with_skills | `cv-detailed-with_skills-jamr-{year}-{lang}.pdf` | +| **short** | clean | `cv-short-jamr-{year}-{lang}.pdf` | +| **short** | with_skills | `cv-short-with_skills-jamr-{year}-{lang}.pdf` | | **extended** | clean | `cv-extended-jamr-{year}-{lang}.pdf` | | **extended** | with_skills | `cv-extended-with_skills-jamr-{year}-{lang}.pdf` | @@ -75,7 +75,7 @@ Static PDF URLs in JSON data files use a `{{YEAR}}` placeholder that's automatic **JSON Configuration:** ```json { - "url": "https://juan.andres.morenorub.io/static/pdf/cv-detailed-jamr-{{YEAR}}-es.pdf" + "url": "https://juan.andres.morenorub.io/static/pdf/cv-short-jamr-{{YEAR}}-es.pdf" } ``` @@ -105,10 +105,10 @@ initials = strings.ToLower(initials) For backwards compatibility, the system automatically maps old localStorage values to the new naming convention: ```javascript -// Old → New mapping -'short' → 'detailed' +// Old → New mapping (for backwards compatibility) 'long' → 'extended' 'extended' (theme) → 'with_skills' +// Note: 'short' now stays as 'short' (no longer maps to 'detailed') 'clean' → 'clean' (unchanged) ``` @@ -218,8 +218,8 @@ This defense-in-depth approach guarantees light mode PDFs even if: │ │ └── 04-interactive/ │ │ └── _remaining.css # Modal styling (red theme for PDF) │ └── pdf/ -│ ├── cv-detailed-jamr-2025-es.pdf -│ ├── cv-detailed-jamr-2025-en.pdf +│ ├── cv-short-jamr-2025-es.pdf +│ ├── cv-short-jamr-2025-en.pdf │ ├── cv-extended-with_skills-jamr-2025-es.pdf │ └── cv-extended-with_skills-jamr-2025-en.pdf ├── data/ @@ -237,13 +237,13 @@ This defense-in-depth approach guarantees light mode PDFs even if: **Parameter Validation:** ```go -// Length parameter: "detailed" or "extended" +// Length parameter: "short" or "extended" length := r.URL.Query().Get("length") if length == "" { - length = "detailed" + length = "short" } -if length != "detailed" && length != "extended" { - HandleError(w, r, BadRequestError("Unsupported length. Use 'detailed' or 'extended'")) +if length != "short" && length != "extended" { + HandleError(w, r, BadRequestError("Unsupported length. Use 'short' or 'extended'")) return } @@ -284,7 +284,7 @@ if version == "clean" { ``` **Examples:** -- detailed + clean → `cv-detailed-jamr-2025-es.pdf` +- short + clean → `cv-short-jamr-2025-es.pdf` - extended + with_skills → `cv-extended-with_skills-jamr-2025-en.pdf` ### Frontend: Modal Interaction with Legacy Mapping @@ -299,8 +299,8 @@ function downloadPDF() { let url; if (selectedFormat === 'short') { - // Short CV: clean version (no skills), detailed length - url = `/export/pdf?lang=${lang}&length=detailed&icons=show&version=clean`; + // Short CV: clean version (no skills), short length + url = `/export/pdf?lang=${lang}&length=short&icons=show&version=clean`; } else if (selectedFormat === 'long') { // Long CV: with skills sidebar, extended length url = `/export/pdf?lang=${lang}&length=extended&icons=show&version=with_skills`; @@ -309,8 +309,8 @@ function downloadPDF() { let currentLength = localStorage.getItem('cv-length') || 'short'; // Map old values to new naming convention - if (currentLength === 'short') currentLength = 'detailed'; if (currentLength === 'long') currentLength = 'extended'; + // 'short' stays as 'short' - no mapping needed const currentIcons = localStorage.getItem('cv-icons') || 'show'; const currentTheme = localStorage.getItem('cv-theme') || 'default'; @@ -339,13 +339,13 @@ Tests the modal interface and user interactions: #### 2. Parameter Validation Test: `24-pdf-download-params.test.mjs` Tests PDF export parameters and filename generation: -- ✅ Short CV parameters: `length=detailed&version=clean` +- ✅ Short CV parameters: `length=short&version=clean` - ✅ Long CV parameters: `length=extended&version=with_skills` - ✅ Current View parameters: reads from localStorage with mapping - ✅ Filename format: `cv-{length}[-{version}]-{initials}-{year}-{lang}.pdf` - ✅ Version omitted for clean - ✅ Dynamic year generation -- ✅ Legacy value mapping (short→detailed, long→extended) +- ✅ Legacy value mapping (long→extended) **Run Tests:** ```bash @@ -381,7 +381,7 @@ bun tests/run-all.mjs **Parameters:** - `lang` (optional, default: "en"): `es` or `en` -- `length` (optional, default: "detailed"): `detailed` or `extended` +- `length` (optional, default: "short"): `short` or `extended` - `icons` (optional, default: "show"): `show` or `hide` - `version` (optional, default: "with_skills"): `clean` or `with_skills` @@ -392,9 +392,9 @@ bun tests/run-all.mjs **Example Requests:** ```bash -# Detailed clean CV in Spanish -curl -O http://localhost:1999/export/pdf?lang=es&length=detailed&icons=show&version=clean -# Filename: cv-detailed-jamr-2025-es.pdf +# Short clean CV in Spanish +curl -O http://localhost:1999/export/pdf?lang=es&length=short&icons=show&version=clean +# Filename: cv-short-jamr-2025-es.pdf # Extended with skills CV in English curl -O http://localhost:1999/export/pdf?lang=en&length=extended&icons=show&version=with_skills @@ -405,7 +405,7 @@ curl -O http://localhost:1999/export/pdf?lang=en&length=extended&icons=show&vers ### Why This Naming Convention? -1. **Clarity**: "detailed" and "extended" clearly communicate content depth +1. **Clarity**: "short" and "extended" clearly communicate content depth 2. **Simplicity**: Version omitted for clean keeps filenames concise 3. **Consistency**: All components follow the same pattern 4. **Intuitive**: Non-technical users can understand what each filename means @@ -415,7 +415,7 @@ curl -O http://localhost:1999/export/pdf?lang=en&length=extended&icons=show&vers | Old Naming | New Naming | Improvement | |-----------|------------|-------------| -| `cv-short-clean-es-jamr-2025.pdf` | `cv-detailed-jamr-2025-es.pdf` | Clearer, more concise | +| `cv-detailed-jamr-2025-es.pdf` (v1) | `cv-short-jamr-2025-es.pdf` | Simpler, more intuitive | | `cv-long-extended-en-jamr-2025.pdf` | `cv-extended-with_skills-jamr-2025-en.pdf` | More descriptive, better clarity | | Language before year | Language after year | Better organization | @@ -426,12 +426,12 @@ curl -O http://localhost:1999/export/pdf?lang=en&length=extended&icons=show&vers To regenerate static PDFs referenced in JSON files: ```bash -# Detailed + clean (version omitted) -curl -o static/pdf/cv-detailed-jamr-2025-es.pdf \ - "http://localhost:1999/export/pdf?lang=es&length=detailed&icons=show&version=clean" +# Short + clean (version omitted) +curl -o static/pdf/cv-short-jamr-2025-es.pdf \ + "http://localhost:1999/export/pdf?lang=es&length=short&icons=show&version=clean" -curl -o static/pdf/cv-detailed-jamr-2025-en.pdf \ - "http://localhost:1999/export/pdf?lang=en&length=detailed&icons=show&version=clean" +curl -o static/pdf/cv-short-jamr-2025-en.pdf \ + "http://localhost:1999/export/pdf?lang=en&length=short&icons=show&version=clean" # Extended + with_skills curl -o static/pdf/cv-extended-with_skills-jamr-2025-es.pdf \ @@ -475,7 +475,7 @@ The system automatically handles year rollovers: **Symptom**: 400 Bad Request when downloading PDF **Solutions:** -1. Check allowed values: `length` ∈ {detailed, extended}, `version` ∈ {clean, with_skills} +1. Check allowed values: `length` ∈ {short, extended}, `version` ∈ {clean, with_skills} 2. Verify frontend sends correct parameters 3. Check browser network tab for actual request 4. Run parameter validation test: `bun tests/mjs/24-pdf-download-params.test.mjs` @@ -524,7 +524,7 @@ The system automatically handles year rollovers: ```bash # Set user to dark mode # Then generate PDF - curl -O "http://localhost:1999/export/pdf?lang=es&length=detailed&version=clean" + curl -O "http://localhost:1999/export/pdf?lang=es&length=short&version=clean" # Open PDF and verify it has white background ``` @@ -540,17 +540,18 @@ The system automatically handles year rollovers: **🎯 Major Changes:** #### 1. Complete Naming Convention Overhaul -- **BREAKING**: Changed from `short/long` to `detailed/extended` for better clarity +- **BREAKING**: Changed from `short/long` to `short/extended` for better clarity - **BREAKING**: Changed from `extended` (theme) to `with_skills` for better clarity - **NEW**: Version omitted from filename when `clean` (no skills sidebar) - **NEW**: Language moved to end: `cv-{length}[-{version}]-{initials}-{year}-{lang}.pdf` +- **UPDATE**: Originally used `detailed/extended`, changed to `short/extended` for better contrast **Old Naming Examples:** -- ❌ `cv-short-clean-es-jamr-2025.pdf` -- ❌ `cv-long-extended-en-jamr-2025.pdf` +- ❌ `cv-short-clean-es-jamr-2025.pdf` (v0) +- ❌ `cv-long-extended-en-jamr-2025.pdf` (v0) **New Naming Examples:** -- ✅ `cv-detailed-jamr-2025-es.pdf` (version omitted) +- ✅ `cv-short-jamr-2025-es.pdf` (version omitted, final naming) - ✅ `cv-extended-with_skills-jamr-2025-en.pdf` (version included) #### 2. Light Mode Enforcement - Defense in Depth @@ -583,17 +584,17 @@ The system automatically handles year rollovers: #### 4. Frontend Updates - **Updated**: PDF modal JavaScript to use new parameters - **Added**: Legacy localStorage mapping for backwards compatibility - - `short` → `detailed` - `long` → `extended` - `extended` (theme) → `with_skills` + - Note: `short` now stays as `short` (no longer maps to `detailed`) #### 5. Static Assets - **Generated**: 4 new PDFs with correct naming convention (2.2 MB each) - - `cv-detailed-jamr-2025-es.pdf` - - `cv-detailed-jamr-2025-en.pdf` + - `cv-short-jamr-2025-es.pdf` (updated from `cv-detailed`) + - `cv-short-jamr-2025-en.pdf` (updated from `cv-detailed`) - `cv-extended-with_skills-jamr-2025-es.pdf` - `cv-extended-with_skills-jamr-2025-en.pdf` -- **Removed**: Old PDFs with deprecated naming convention +- **Removed**: Old PDFs with deprecated naming (`cv-detailed-*`) #### 6. Documentation - **NEW**: "Print-Friendly Design: Light Mode Only" section diff --git a/data/cv-en.json b/data/cv-en.json index 15116f9..0cabb94 100644 --- a/data/cv-en.json +++ b/data/cv-en.json @@ -902,7 +902,7 @@ }, { "title": "Download this curriculum in English", - "url": "https://juan.andres.morenorub.io/static/pdf/cv-detailed-jamr-{{YEAR}}-en.pdf", + "url": "https://juan.andres.morenorub.io/static/pdf/cv-short-jamr-{{YEAR}}-en.pdf", "type": "cv", "textBefore": "Download this curriculum in", "linkText": "English" diff --git a/data/cv-es.json b/data/cv-es.json index a4d1135..d29032c 100644 --- a/data/cv-es.json +++ b/data/cv-es.json @@ -907,7 +907,7 @@ }, { "title": "Descargar este currículum en Español", - "url": "https://juan.andres.morenorub.io/static/pdf/cv-detailed-jamr-{{YEAR}}-es.pdf", + "url": "https://juan.andres.morenorub.io/static/pdf/cv-short-jamr-{{YEAR}}-es.pdf", "type": "cv", "textBefore": "Descargar este currículum en", "linkText": "Español" diff --git a/static/pdf/cv-detailed-jamr-2025-en.pdf b/static/pdf/cv-short-jamr-2025-en.pdf similarity index 99% rename from static/pdf/cv-detailed-jamr-2025-en.pdf rename to static/pdf/cv-short-jamr-2025-en.pdf index b673a397f2176f3ad7594b6db196d184e21c4ba5..39e10e36738a7b1060d437f54426e95297225824 100644 GIT binary patch delta 13391 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'qA_BL^|l zax_5B{XyW*^-HF+r;~woDj5>A0uVHu6emI(E(V|x1vE6_z~7DuE~{~#R)Vt+D{$4t zo~U%NUaRvh%-kdm?bhIFbo>c2A1_UnDpZGi2*y^ zH6olE5?R}+j+b;=g3}Vz3#$|T%+YV& z@gK+l-pZKr-7!X?YUwzqmfO5D;p$n}`%M|4|+9E^*`oDk3LB zZf~4EDPWeG-a!<(fu1zgA>ia)v#UUinhfAr@=)Wps-ZIPKsD~~cc9Z`uemW5# zb)C$`v!n4GNYb{I(b_u%7vEJn7a&Uo1D6{Q<8N=(U0?vv150iLFXO-(VhaeBJ0=|m zC{*!tN2Is{)V{h3G-dXznEle_%1M*wsK1P5b+S=W*ryX2VSV*fiCi7M~P9n4xT% zf=Jz%abt7F#RE#e8FHoSn44Mce5J$-2Dj7#m+Y;=d5U oz^h7L`{{zbyz(@?<7YuyZvF9pA3gl+Ipxjs4?g(G&wu*-|5Se#ZU6uP delta 13353 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 ZuY>OY_x|apk4a%3zxn3d@BHNP{{aAR62AZd diff --git a/static/pdf/cv-detailed-jamr-2025-es.pdf b/static/pdf/cv-short-jamr-2025-es.pdf similarity index 99% rename from static/pdf/cv-detailed-jamr-2025-es.pdf rename to static/pdf/cv-short-jamr-2025-es.pdf index 370a0f61c97661e6d9404a0a73043d7f0011b594..c86a625bba8e814be61b9fbaaae21a7a028a3db4 100644 GIT binary patch delta 13400 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