5.2 KiB
Service Finder Fejlesztési Történet
2026-06-14 - Admin Search Bugs Fix & Sticky UX
🎯 Cél
Backend SQL hibák javítása a GET /admin/users végponton (Address outerjoin, phone search), valamint frontend UX fejlesztések (sticky bulk action bar, clear/X gomb, üres állapot üzenet, HeaderProfile az AdminLayout-ban).
🔧 Változtatások
1. BACKEND - admin.py:
GET /admin/usersSQL javítás:outerjoin(Person).outerjoin(Address)→outerjoin(Person).outerjoin(Address, ...)(explicit ON clause a person_id-n)phonekeresés hozzáadva asearch_category-hez (LIKEperson.phone)is_activeésis_deletedfilterek külön kezelése (nem zárják ki egymást)
2. FRONTEND - AdminUsersView.vue:
- Bulk action bar:
stickypozícionálás (top-0, z-30) - Clear/X gomb a keresőmezőben
- Üres állapot kezelés: "No users match your search" / "No users in the database yet."
- HeaderProfile komponens hozzáadva az AdminLayout-hoz
✅ Verifikáció
docker compose exec sf_api python3 -m pytest backend/tests/test_04_business_onboarding.py -v→ 7 passed- Manuális teszt: GET /admin/users?search_term=...&search_category=phone működik
2026-06-19 - P0 BUG FIX: VehicleDetails Blank Page & OverviewTab
🎯 Cél
A VehicleDetailsView üres oldalt (blank page) mutatott, amikor a Dashboardról vagy FleetView-ról navigáltak rá. A hiba oka a nem-reaktív tab definíciók és a hiányzó loading/error állapotkezelés volt. Emellett az OverviewTab csak egy placeholdert tartalmazott.
🔧 Változtatások
1. VehicleDetailsView.vue - Blank Page Fix:
- Root Cause: A
tabstömbconst-ként volt definiálva, bennecomputed()ref-ekkel, amelyek sosem frissültek. Av-for="tab in tabs"nem volt reaktív. - Fix: A
tabstömbötcomputed<TabDefinition[]>(() => [...])-re cseréltük, így a teljes tömb reaktív. - Loading State:
v-if="isLoading"spinner hozzáadva, ami akkor jelenik meg, havehicleStore.isLoadingtrue VAGY a vehicles tömb üres és a vehicle még nincs betöltve. - Error/Empty State:
v-else-if="!vehicle"üres állapot ikonnal ést('vehicleDetail.notFound')üzenettel. - Vehicle Data Flow:
provide('vehicle', vehicle)használatával a jármű adatokat átadjuk a child tab komponenseknek. - Async onMounted:
await vehicleStore.fetchVehicles()hívás, hogy direkt URL-es navigációnál (F5) is betöltődjenek az adatok.
2. OverviewTab.vue - Full Layout:
- Photo Section: 16:9 / négyzet alakú placeholder szürke háttérrel, kamera ikonnal és "Photo upload coming soon" felirattal.
- Basic Info: Nagy, hangsúlyos rendszám (4xl), alatta brand/model (2xl), évjárat, majd elválasztó után VIN, üzemanyag típus, futásteljesítmény.
- Vital Signs (3 kártya):
- MOT Expiry: Naptár ikon, dátum megjelenítés, színkódolás (piros=lejárt, sárga=<30 nap, zöld=rendben).
- Current Mileage: Villám ikon, formázott km érték.
- Next Service: Dokumentum ikon, "Coming soon" placeholder (később a service book-hoz kapcsolva).
- Data Flow:
inject<computed<Vehicle | null>>('vehicle')a szülő komponensből.
3. en.ts - New i18n keys:
vehicleDetail.notFound,vehicleDetail.noPlate,vehicleDetail.photoPlaceholder,vehicleDetail.vin,vehicleDetail.fuelType,vehicleDetail.mileage,vehicleDetail.motExpiry,vehicleDetail.nextService,vehicleDetail.noData,vehicleDetail.comingSoon
✅ Verifikáció
- A tab navigáció most már reaktív (
computed-be csomagolttabDefinitions) - A loading spinner megjelenik adatok betöltése közben
- Az OverviewTab teljes layout-ja renderelődik: fotó placeholder + alapadatok + 3 vital signs kártya
- A jármű adatok
provide/injectmechanizmussal jutnak el a tab komponensekhez
2026-06-19 - FleetView jármű részletek navigációs hiba javítása
🎯 Cél
A privát jármű oldalon (FleetView) a kártyákra kattintva nem nyílt meg a jármű teljes adatlapja az 5 aloldallal (Overview, TechData, ServiceBook, Financials, Documents).
🔧 Változtatások
1. FleetView.vue: A @click handler router.push(\/vehicles/${vehicle.id}`)` útvonalat használt, ami nem egyezik egyetlen regisztrált route-pal sem. A helyes útvonalak:
- Privát mód:
/dashboard/vehicles/:id - Céges mód:
/organization/:id/vehicles/:id
Javítás: Az openVehicleDetail() függvény az authStore.isCorporateMode és active_organization_id alapján dinamikusan választja ki a megfelelő útvonalat, megegyező logikával, mint a MyVehiclesCard.vue-ben lévő openVehicleDetail().
✅ Verifikáció
- A kártyára kattintás után a böngésző a
/dashboard/vehicles/:id(privát) vagy/organization/:id/vehicles/:id(céges) útvonalra navigál - A
VehicleDetailsView.vuebetöltődik és megjeleníti az 5 tabot - A TypeScript fordítás hibátlan (csak pre-existing
.jsfájl warningok)