Files
service-finder/.roo/history.md
2026-06-19 09:09:24 +00:00

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/users SQL javítás: outerjoin(Person).outerjoin(Address)outerjoin(Person).outerjoin(Address, ...) (explicit ON clause a person_id-n)
  • phone keresés hozzáadva a search_category-hez (LIKE person.phone)
  • is_active és is_deleted filterek külön kezelése (nem zárják ki egymást)

2. FRONTEND - AdminUsersView.vue:

  • Bulk action bar: sticky pozí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 tabs tömb const-ként volt definiálva, benne computed() ref-ekkel, amelyek sosem frissültek. A v-for="tab in tabs" nem volt reaktív.
  • Fix: A tabs tömböt computed<TabDefinition[]>(() => [...])-re cseréltük, így a teljes tömb reaktív.
  • Loading State: v-if="isLoading" spinner hozzáadva, ami akkor jelenik meg, ha vehicleStore.isLoading true VAGY a vehicles tömb üres és a vehicle még nincs betöltve.
  • Error/Empty State: v-else-if="!vehicle" üres állapot ikonnal és t('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 csomagolt tabDefinitions)
  • 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/inject mechanizmussal 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.vue betöltődik és megjeleníti az 5 tabot
  • A TypeScript fordítás hibátlan (csak pre-existing .js fájl warningok)