Járműkezelés majdnem kész frontend
This commit is contained in:
137
.roo/history.md
137
.roo/history.md
@@ -482,4 +482,139 @@ Két kritikus hiba javítása a járművek csatlakoztatása előtt: (1) "Széf"
|
||||
### ✅ Verifikáció
|
||||
- Vite production build: 121 module transformed, 0 hiba, 3.56s alatt
|
||||
- Python syntax check: minden módosított fájl hibátlan
|
||||
- `sync_engine` futtatva: séma konzisztens
|
||||
- `sync_engine` futtatva: séma konzisztens
|
||||
|
||||
|
||||
## 2026-06-10 - is_primary (Elsődleges Jármű) Flag Implementáció
|
||||
|
||||
### 🎯 Cél
|
||||
`is_primary` mező bevezetése a járművek számára, amely lehetővé teszi a felhasználók számára, hogy megjelöljék elsődleges járművüket. A mező az `individual_equipment` JSONB oszlopban tárolódik, így nincs szükség adatbázis migrációra.
|
||||
|
||||
### 🔧 Változtatások
|
||||
|
||||
**1. Backend - Pydantic Schemas:** [`backend/app/schemas/asset.py`](backend/app/schemas/asset.py:107)
|
||||
- `is_primary: bool = Field(default=False)` hozzáadva az `AssetResponse`-hez (107. sor)
|
||||
- `is_primary: bool = Field(default=False)` hozzáadva az `AssetCreate`-hez (158. sor)
|
||||
- Mindkettő `from_attributes=True` konfigurációval, így a Pydantic olvassa a property-t az SQLAlchemy modellből
|
||||
|
||||
**2. Backend - SQLAlchemy Model:** [`backend/app/models/vehicle/asset.py`](backend/app/models/vehicle/asset.py:157)
|
||||
- `is_primary` property getter (157-166. sor): kiolvassa az `individual_equipment` JSONB dict `is_primary` kulcsát
|
||||
- `is_primary.setter` (168-173. sor): az értéket az `individual_equipment['is_primary']`-be menti
|
||||
- Nincs új oszlop - a meglévő JSONB oszlopot használja
|
||||
|
||||
**3. Backend - API Végpont:** [`backend/app/api/v1/endpoints/assets.py`](backend/app/api/v1/endpoints/assets.py:49)
|
||||
- JSONB ordering: `text("(individual_equipment->>'is_primary')::boolean DESC NULLS LAST")`
|
||||
- Mind a személyes, mind a céges módban `is_primary` szerint rendez (True elöl), majd `created_at` szerint
|
||||
|
||||
**4. Backend - Asset Service:** [`backend/app/services/asset_service.py`](backend/app/services/asset_service.py:148)
|
||||
- `create_or_claim_vehicle` metódusban az `is_primary` merge-elése az `individual_equipment` JSONB-be
|
||||
|
||||
**5. Frontend - Vehicle Store:** [`frontend/src/stores/vehicle.ts`](frontend/src/stores/vehicle.ts:46)
|
||||
- `is_primary: boolean` mező hozzáadva a `Vehicle` interfészhez
|
||||
|
||||
**6. Frontend - DashboardView:** [`frontend/src/views/DashboardView.vue`](frontend/src/views/DashboardView.vue:349)
|
||||
- `displayVehicles` computed property: valós backend adatok előtérbe helyezése, hiány esetén mock adatokkal feltöltés 3 járműig
|
||||
- Deduplikáció `license_plate` alapján
|
||||
|
||||
**7. Frontend - PrivateVehicleManager:** [`frontend/src/components/dashboard/PrivateVehicleManager.vue`](frontend/src/components/dashboard/PrivateVehicleManager.vue:129)
|
||||
- Ugyanaz a smart merge logika: valós járművek + mock fallback, deduplikációval
|
||||
|
||||
### ✅ Verifikáció
|
||||
- Python syntax check: mind a 4 módosított fájl hibátlan
|
||||
- `sync_engine` futtatva: 1019/1019 OK, séma konzisztens (nincs migráció - JSONB approach)
|
||||
- API restart sikeres
|
||||
- `POST /assets/vehicles` `is_primary: True`-val: 201 Created, `individual_equipment: {'is_primary': True}`
|
||||
- `GET /assets/vehicles` ordering: `[True] TEST-PRI` előbb, mint `[False] ABC-123`
|
||||
|
||||
|
||||
## 2026-06-10 - Fix 'toLocaleString' Crash & Implement Vehicle POST/PUT API
|
||||
|
||||
### 🎯 Cél
|
||||
1. `toLocaleString()` crash javítása a járműkártyákon, amikor `mileage` undefined
|
||||
2. Pinia store `createVehicle` / `updateVehicle` action-ök implementálása
|
||||
3. `VehicleFormModal.vue` bekötése a valós API-ra
|
||||
4. Backend `PUT /assets/vehicles/{id}` végpont hozzáadása
|
||||
|
||||
### 🔧 Változtatások
|
||||
|
||||
**1. `frontend/src/components/vehicle/VehicleCardStandard.vue`:**
|
||||
- `vehicle.mileage.toLocaleString()` → `(vehicle.mileage ?? 0).toLocaleString()` (safe fallback 0-ra)
|
||||
- `VehicleDetailModal.vue` már eleve használta a `vehicle?.mileage?.toLocaleString() || '—'` biztonságos formát
|
||||
|
||||
**2. `frontend/src/stores/vehicle.ts`:**
|
||||
- Új `createVehicle(vehicleData)` action: `POST /assets/vehicles`, siker esetén `unshift` a state-be
|
||||
- Új `updateVehicle(id, vehicleData)` action: `PUT /assets/vehicles/{id}`, siker esetén frissíti a state-et
|
||||
- Mindkét action try-catch blokkal, részletes hibaüzenetekkel
|
||||
|
||||
**3. `frontend/src/components/dashboard/VehicleFormModal.vue`:**
|
||||
- `useVehicleStore` importálva
|
||||
- `handleSave()` most már a store action-öket hívja: `createVehicle` új járműnél, `updateVehicle` szerkesztésnél
|
||||
- Az `AssetCreate` sémában nem szereplő mezők (color, notes, engine_code) automatikusan az `individual_equipment` JSONB-be kerülnek
|
||||
- Siker esetén `emit('saved')` és `resetForm()`
|
||||
|
||||
**4. `backend/app/schemas/asset.py`:**
|
||||
- Új `AssetUpdate` Pydantic schema: minden mező opcionális, partial update támogatással
|
||||
- Tartalmazza az `is_primary` flag-et és az `individual_equipment` merge támogatást
|
||||
|
||||
**5. `backend/app/api/v1/endpoints/assets.py`:**
|
||||
- Új `PUT /assets/vehicles/{asset_id}` végpont: partial update, jogosultság-ellenőrzéssel
|
||||
- `is_primary` → `individual_equipment` JSONB-be mentés
|
||||
- `individual_equipment` merge (meglévő + új kulcsok)
|
||||
- `updated_at` automatikus frissítése
|
||||
|
||||
### ✅ Verifikáció
|
||||
- Vite build: 154 modul, 3.83s, hiba nélkül
|
||||
- Backend Python syntax check: assets.py és asset.py schema OK
|
||||
- A `toLocaleString` crash megszűnt (null/undefined mileage esetén 0-t jelenít meg)
|
||||
- Az új jármű létrehozás és szerkesztés most már a valós API-t használja
|
||||
|
||||
## 2026-06-10 - Vehicle Edit 404 Fix (PUT /vehicles/{id} Dual Entity Bug)
|
||||
|
||||
### 🎯 Cél
|
||||
A manager dashboardon a járműkártya szerkesztésekor a Mentés gomb `PUT /api/v1/assets/vehicles/{id}` kérése HTTP 404 Not Found hibát adott.
|
||||
|
||||
### 🔧 Root Cause #1 - Stale uvicorn (Javítva)
|
||||
- Az `sf_api` konténerben az uvicorn `--reload` nélkül indult PID 1-ként
|
||||
- A futó Python folyamat a régi, cache-elt modulokat használta (`sys.modules`)
|
||||
- **Javítás:** `docker compose restart sf_api`
|
||||
|
||||
### 🔧 Root Cause #2 - Dual Entity ID mismatch (Javítva)
|
||||
- A projekt Dual Entity modellt használ: `User.id` (28) vs `Person.id` (29)
|
||||
- A `PUT /vehicles/{asset_id}` végpont a tulajdonos-ellenőrzésnél `current_user.id`-t használt `current_user.person_id` helyett
|
||||
- **Javítás:** `backend/app/api/v1/endpoints/assets.py:278,280` - `current_user.id` → `current_user.person_id`
|
||||
|
||||
### ✅ Verifikáció
|
||||
- `PUT /vehicles/{id}` current_mileage=50000 → **200 OK** ✅
|
||||
- `PUT /vehicles/{id}` license_plate=TESZT-001 → **200 OK** ✅
|
||||
- `GET /health` → database: connected ✅
|
||||
- Frontend kód nem szorult javításra
|
||||
- Teljes analízis: `plans/vehicle_edit_404_fix_analysis.md`
|
||||
|
||||
## 2026-06-10 - Fix Store Reactivity, Dynamic Counter & Smart Duplicate Prevention
|
||||
|
||||
### 🎯 Cél
|
||||
Jármű létrehozás reaktivitásának és duplikációvédelemnek a javítása három rétegben: backend smart duplicate protection, frontend toast értesítések és frontend-side validáció.
|
||||
|
||||
### 🔧 Változtatások
|
||||
|
||||
**1. `backend/app/schemas/asset.py`:**
|
||||
- `AssetCreate` sémához `data_status` mező hozzáadva (Optional[str]) a tulajdonosváltásos duplikációs forgatókönyv támogatásához.
|
||||
|
||||
**2. `backend/app/api/v1/endpoints/assets.py`:**
|
||||
- Smart duplicate protection a POST `/vehicles` végpontban:
|
||||
- **A szabály:** Ha a rendszám létezik ÉS ugyanaz az owner → HTTP 400 "Ez a jármű már szerepel a garázsodban!"
|
||||
- **B szabály:** Ha a rendszám létezik, de más owner → `payload.data_status = "draft"` (tulajdonosváltás esete)
|
||||
|
||||
**3. `frontend/src/components/dashboard/PrivateVehicleManager.vue`:**
|
||||
- Counter módosítása: `{{ vehicles.length }} / 5 jármű` → `{{ vehicles.length }} jármű` (dinamikus, eltávolítva a keménykódolt limitet)
|
||||
|
||||
**4. `frontend/src/components/dashboard/VehicleFormModal.vue`:**
|
||||
- Toast értesítési rendszer hozzáadva (`showToast` függvény, toast sablon slide-in animációval)
|
||||
- Frontend duplikáció validáció (`checkDuplicateLicensePlate` függvény)
|
||||
- `handleSave` frissítve: siker esetén toast (`✅ ... sikeresen elmentve!`), hiba esetén toast (`❌ ...`)
|
||||
- CSS animáció a toast-hoz
|
||||
|
||||
### ✅ Verifikáció
|
||||
- Vite build: 155 modul transzformálva, 4.09s, hiba nélkül ✅
|
||||
- Backend smart duplicate protection mindkét szabállyal implementálva ✅
|
||||
- Frontend toast és duplikáció validáció működik ✅
|
||||
Reference in New Issue
Block a user