Click a car in Carmodoo search results to instantly import it and
open the detail modal with images. If already imported, opens the
existing car's detail modal instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Backend: Add search (car name/plate number), color, year filters to GET /api/cars
- Frontend: Add filter bar with car name/plate, color, year range inputs
- Clear button resets all filters
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract main_image from HTML img tags instead of constructing from
car_no pattern. Handles timestamp-based filenames (e.g., 1767925381_0.jpg)
that differ from the default cmcar_0.jpg pattern.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When __carPhoto URL pattern returns 404 (e.g., timestamp-based filenames
like 1767161441_0.jpg instead of cmcar_0.jpg), fall back to fetching
actual image URLs from /common/ajax/AutoDB.html?mode=view&key={car_key}
XML response (strPhotos field).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rename image PDF to {carName}_{carNumber}.pdf
- Add performance check PDF download button (blue, next to image PDF)
- Performance check PDF named {carName}_{carNumber}_성능점검표.pdf
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Download all car images as a single PDF (A4 landscape, one image per page)
- Button shows image count and displays in modal header for easy access
- Uses jsPDF library for client-side PDF generation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Wait for isLoading to complete before checking user state to avoid
premature redirect when navigating from profile page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add dealer program section to profile page with apply/view card button
- Add 2-step dealer application: privacy consent + obligations agreement before form
- Add all translations (en/mn/ru/ko) for new dealer agreement UI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Static dictionary (i18n.ts CAR_TRANSLATIONS) already covers all terms.
DB translations table had only 179 entries used as fallback and was
never actually reached. Simplifies useTranslate hook to static-only.
DB table preserved for safety.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sends HTML email via Gmail SMTP when notifications are created.
Supports multi-language (en/ko/mn/ru) based on user country.
Runs in background thread to avoid blocking requests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a green button below the vehicle list that approves all vehicles
and sends notification to the user. Status changes to Completed.
Previously there was no way to trigger the approve + notify flow from UI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Backend: Include car_name in skipped response
- Frontend: Display skip details (car name + reason like "Already imported (ID: 123)")
- Frontend: Display error details with error message
- Add import process description during loading
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sample car images (Tesla, Sportage etc.) now only appear as fallback
when the API fails to respond within 3 seconds. During normal loading,
a pulse-animated skeleton is shown instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Backend: Review model, full API (public/user/admin endpoints)
- Frontend: list, detail, write/edit pages, admin management
- 1 CC reward for writing a review on completed vehicle requests
- Navigation updates (Header + admin sidebar)
- "Write Review" button on my-request page for completed requests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Detect GoLogin redirect response (126 bytes) when session cookies expire,
automatically re-login and retry the search once.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Analytics.tsx component for tracking with Umami (self-hosted) and Microsoft Clarity
- Update layout.tsx to include Analytics component
- Environment variables: NEXT_PUBLIC_UMAMI_WEBSITE_ID, NEXT_PUBLIC_CLARITY_ID
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added complex_code parameter to search_cars method
- Added /api/carmodoo/complexes endpoint with list of Korean auto complexes
- Added Complex dropdown as first filter in admin Cars search
- Passes complex_code to Carmodoo API as c_danji parameter
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The margin input was making API calls on every keystroke, causing race
conditions and making it difficult to edit values (especially to 0).
Changed to:
- Use defaultValue + key pattern for uncontrolled input
- Save only onBlur (when user clicks away)
- Only call API if value actually changed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Carmodoo HTML response sometimes contains invalid EUC-KR byte
sequences (e.g., 0xA4 followed by ASCII 'F'). This caused the decoder
to fall back to Latin-1, corrupting all Korean text.
Fixed by using errors='replace' which preserves Korean text while
replacing only the invalid byte sequences with replacement characters.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
lxml was re-encoding already decoded UTF-8 HTML based on charset="euc-kr"
meta tag. Fixed by removing charset meta tags and explicitly setting
UTF-8 encoding in HTMLParser.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fetch vehicles from user's MyRequest
- Show dropdown with vehicle names and prices
- Auto-select first vehicle if available
- Show 'Example: 20,000,000 KRW' if no vehicles
- Add checkbox selection for cars in All Cars tab when requestId is present
- Add "Add to Request" button with selection count
- Add select all/deselect all functionality
- Highlight selected cars with blue ring
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changed from { car_ids: [...] } to { cars: [...] } format
- Now includes full car details required by backend ImportCarsRequest schema
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added 'cho': '' parameter to enable searching both domestic and import cars
- This fixes Toyota Prius (and other import cars) not appearing in search results
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- About page: CarsImage as large hero with company intro below
- Contact page: HandShakeImage as semi-transparent hero background
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add handshake image to About page Company Introduction section
- Add cars-export image as background in Contact page Business Partnership section
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Backend: Include promo_preferred_maker, promo_preferred_model, promo_email_enabled in admin/users API
- Frontend: Add AdminUser interface fields
- Admin UI: Display Promo Interest column with maker/model and email alert status
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Changed from carsApi to carmodooApi for maker/model data
- Now shares same data source as vehicle-request page
- Added CarmodooMaker and CarmodooModel types
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Adjust layout to center Request Vehicle with PromoPreference on right
- Use translateCarName for maker/model names in combo boxes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
FastAPI's redirect_slashes was causing /makers/ to redirect to /makers
which then didn't match the route definition.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move /makers/ and /models/ routes before /{car_id} to fix route conflict
- Center Request Vehicle button, move PromoPreference to the right
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add promo preference fields to User model (promo_preferred_maker,
promo_preferred_model, promo_email_enabled)
- Create API endpoints for getting/updating promo preferences
- Create PromoPreference component with maker/model selection
- Show login prompt for non-logged-in users when interacting
- Add promo notification service to send emails when matching vehicles
are added to promotion
- Add multi-language translations (en, mn, ru, ko)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add BoardCategory and BoardPost models with multi-language support
- Add bulletin API endpoints (CRUD, notice toggle, pin toggle)
- Add board_enabled setting to control menu visibility
- Create frontend board pages (list, detail, write, edit)
- Create admin board management and category management pages
- Update Header.tsx with conditional Board menu between Inquiry and Contact Us
- Update admin settings with board_enabled toggle
- Add Board menu to admin sidebar
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>