8 Commits

Author SHA1 Message Date
Tuan-Dat Tran
6db5d323c4 feat: Add PDF generation route and update dependencies
Introduces a new /pdf route to handle PDF generation.
Updates src/index.tsx to integrate the new PDF route.
Bumps puppeteer, tailwindcss, elysia, typed-html, and sortablejs dependencies in package.json and bun.lock.
These updates support the new PDF generation functionality.
2025-11-24 23:24:02 +01:00
Tuan-Dat Tran
3de8f6a971 feat(db): Implement schema migrations and add Projects section
Introduces a custom migration system for SQLite, allowing incremental and safe schema evolution.
Adds a new 'Projects' section to the CV, including database tables, public UI, and full management
in the admin dashboard with live editing, drag-and-drop reordering, and collapsible forms.

Updates:
-  and  for schema management.
-  with  script.
-  to use migrations.
-  to rely on migrations.
-  and  for new project data operations.
-  and  for Projects UI.
-  and  to integrate the Projects section.

Also updates:
-  to automatically import Keycloak realm on startup.
-  for the Elysia app build.
-  with refined print styles (omitting socials and about).
2025-11-22 11:20:03 +01:00
Tuan-Dat Tran
be0be3bd00 feat: Implement drag-and-drop reordering, collapsible forms, and UI refinements
Introduces drag-and-drop functionality for Experience and Education entries in the admin dashboard
using SortableJS, along with collapsible forms powered by Alpine.js. Ensures live updates via HTMX.

Refines both public site and admin dashboard UI:
- Public site: Role/Degree are more prominent, Company/Institution highlight on hover.
- Admin dashboard: Headers display Role/Degree as primary and include date ranges.

Addresses backend needs by re-introducing 'display_order' to the database schema and
updating queries and mutations for proper reordering.

Fixes:
- Resolved 'invalid_grant' Keycloak error by correcting PKCE code verifier generation.
- Corrected database query parameter passing to fix text field clearing on form save.
- Fixed JSX parsing errors with Alpine.js attributes by using full syntax and spread operator.
- Resolved DOMTokenList whitespace error in SortableJS ghostClass.
- Fixed SortableJS initialization and drag events to ensure visual reordering.
2025-11-22 00:45:40 +01:00
Tuan-Dat Tran
3c990e5ab6 feat: Implement live editing (HTMX) and refine UI hierarchy
Integrates HTMX for real-time updates of Experience and Education forms in the admin dashboard,
eliminating full page reloads on save and enabling instant addition of new entries.
Adjusted the visual prominence of 'Role' in Experience and 'Degree' in Education sections.

Fixes:
- Corrected database query parameter passing, resolving text field clearing issue on save.
- Enabled live 'Add New' functionality for Experience and Education entries.
2025-11-22 00:05:50 +01:00
Tuan-Dat Tran
4dc258606e docs: Update README with setup instructions for Keycloak and CMS 2025-11-21 20:31:28 +01:00
Tuan-Dat Tran
1346d36f5d feat: Implement Keycloak authentication and a basic CMS
Integrates Keycloak for secure administrator authentication using Arctic.
Introduces a full CMS dashboard for managing CV content, supporting multi-language editing for profile, experience, and education sections.

Refactors application routes for modularity and adds initial unit tests for database queries.

Also includes minor UI/UX refinements, animation setup, and local Keycloak docker-compose configuration.

Fixes:
- Corrected KeyCloak import.
- Restored missing getEducation function.
- Ensured proper HTTP redirects.
- Fixed PKCE code verifier length.
2025-11-21 20:28:56 +01:00
Tuan-Dat Tran
88aeaa9002 Initial commit: CV website with ElysiaJS, SQLite, and TailwindCSS 2025-11-21 20:07:05 +01:00
Tuan-Dat Tran
378487efc8 Initial commit (via bun create) 2025-11-21 19:41:55 +01:00