14 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:Addressouterjoin-ra változtatva (isouter=True), hogy a cím nélküli userek is visszajöjjenek- Telefonszám keresés:
phonemező hozzáadva aor_()feltételhez
2. FRONTEND - AdminLayout.vue:
HeaderProfilekomponens beillesztve a jobb felső sarokba (belépett user avatar + név)- A
SidebarTogglegomb fixálva a sidebar szélén
3. FRONTEND - AdminUsersView.vue:
- Sticky Bulk Action Bar: A tömeges műveletek sáv (
BulkActionBar)stickypozícionálást kapott, hogy görgetéskor is látszódjon - Clear/X gomb: A keresőmezőbe egy
Xgomb került, ami egy kattintással törli a keresési feltételt
2026-06-16 - Fix 404 API Router & Redesign Dashboard Launcher Card
🎯 Cél
A Dashboard Service Finder kártya (Card 3) átalakítása elegáns, kétgombos indítópulttá (Launcher), valamint a providers API 404 hiba kivizsgálása és javítása.
🔧 Változtatások
1. BACKEND AUDIT - api.py:
- Ellenőrizve:
providersrouter regisztrálva van (include_router(providers.router, prefix="/providers")) - Ellenőrizve: providers végpontokon NINCS trailing slash (
/categories,/search,/quick-add) - Route-ok élőben is ellenőrizve:
GET /api/v1/providers/categories,GET /api/v1/providers/search,POST /api/v1/providers/quick-addmind aktívak
2. FRONTEND - ProviderQuickAddModal.vue:
fetchCategories()már rendelkezik try/catch blokkal, 11 hardcoded fallback kategóriával- Nincs szükség módosításra
3. FRONTEND - DashboardView.vue:
- Card 3 teljes átalakítása: A 3-lépéses kontextuális kereső űrlap (input, 2 dropdown, keresés gomb) ELTÁVOLÍTVA
- Launcher dizájn: Két nagy gomb, szépen formázva:
🔍 Szervizek Keresése— nagy, zöld gradient gomb,isSearchModalOpenmodalt nyit➕ Új Szolgáltató Rögzítése— szekunder, dashed border gomb,isSfQuickAddOpenmodalt nyit (meglévő ProviderQuickAddModal)
- Search Modal (Placeholder): Teleportált modál, benne:
🔍ikon, "Részletes kereső térképpel hamarosan..." szöveg, fejlesztés alatt státusz - Régi
sfSearchLocation,sfSearchCategory,sfSearchVehicleId,sfCategories,fetchSfCategories(),onSfSearch()eltávolítva
2026-06-17 - P0 Bugfix: Provider Data Persistence & Schema Alignment
🎯 Cél
Kritikus adatperzisztencia hiba javítása a Service Finder Provider rendszerében. A frontend edit modal nem hívott backend API-t, így a szerkesztett adatok elvesztek. Emellett a contact mezők (phone, email, website, tags) nem kerültek perzisztálásra a quick-add során, és a search nem adta vissza ezeket.
🔧 Változtatások
1. BACKEND - provider.py (NEW):
ProviderQuickAddIn:contact_phone,contact_email,website,tagsmezők hozzáadvaProviderSearchResult:address_zip,contact_phone,contact_email,website,tagsmezők hozzáadvaProviderUpdateIn(NEW): name, city, address_zip, street, contact_phone, contact_email, website, tagsProviderUpdateResponse(NEW): id, name, status, message
2. BACKEND - provider_service.py:
quick_add_provider(): contact mezők mentése ServiceProfile-basearch_providers(): LEFT JOIN ServiceProfile, contact mezők visszaadásaupdate_provider()(NEW): Organization + ServiceProfile atomi frissítése
3. BACKEND - providers.py:
PUT /providers/{id}végpont hozzáadva (authentikált, hibakezeléssel)
4. FRONTEND - ProviderEditModal.vue:
- CRITICAL FIX:
handleSave()mostapi.put()-et hív, nem csak eventet emitál @save→@saved(past tense, API call után)address_zip,contact_phone,contact_email,website,tagsmezők támogatásasourcekivéve a payload-ból (backend-only)
5. FRONTEND - ProviderQuickAddModal.vue:
- Telefon, email, weboldal, címkék mezők hozzáadva a formhoz
- Tag management (vessző/pontosvessző parsing, remove gomb)
- Payload bővítése contact mezőkkel
6. FRONTEND - ServiceFinderView.vue:
@save→@savedevent bindinghandleEditSaved(): mentés után automatikus keresés újrafuttatás
✅ Verifikáció
sync_enginelefuttatva: 1061 elem OK, 0 javítás, 0 shadow data - rendszer tökéletesen szinkronban
2026-06-17 - P1 Critical Align: Atomizált címmezők a Provider sémákban
🎯 Cél
A street: Optional[str] mező eltávolítása és helyette atomizált címmezők (address_street_name, address_street_type, address_house_number) bevezetése a Pydantic sémákban, backend service-ben és frontend űrlapokon. A kapcsolatfelvételi adatok (contact_phone, contact_email, website, tags) a ServiceProfile-ba kerülnek.
🔧 Változtatások
1. BACKEND - provider.py:
streetmező ELTÁVOLÍTVA aProviderQuickAddInésProviderUpdateInsémákbóladdress_street_name,address_street_type,address_house_numbermezők HOZZÁADVA mindkét sémáhozProviderSearchResultbővítve az atomizált címmezőkkel
2. BACKEND - provider_service.py:
quick_add_provider():data.street→data.address_street_name,data.address_street_type,data.address_house_numberaz Organization és Branch táblákbanupdate_provider(): ugyanez az atomizált címkezeléssearch_providers(): az org SELECT most már tartalmazza azaddress_street_name,address_street_type,address_house_numbermezőket- A Branch létrehozásánál a
street_name,street_type,house_numbermezők külön-külön töltődnek
3. FRONTEND - ProviderQuickAddModal.vue:
- A régi egyesített "Cím (Utca, házszám)" mező helyett 3 külön mező: Utca neve (text), Közterület jellege (select/dropdown 15 opcióval), Házszám (text)
- Payload az új atomizált kulcsokkal megy a backend felé
4. FRONTEND - ProviderEditModal.vue:
- Ugyanaz a 3 mezős szétbontás, a form populate az atomizált mezőkből történik
- Payload atomizált kulcsokkal
5. FRONTEND - ProviderDetailModal.vue:
- Az intelligens címösszefűzés (
formattedAddresscomputed) aprovider.address_street_name + ' ' + provider.address_street_type + ' ' + provider.address_house_numberalapján történik hasAddresscomputed ellenőrzi az atomizált mezők meglétét
✅ Verifikáció
sync_enginelefuttatva: 1061 elem OK, 0 javítás, 0 shadow data - rendszer tökéletesen szinkronban- Python syntax check: minden fájl szintaktikailag helyes
2026-06-17 - Provider Update & Search Fix Csomag (#264)
🎯 Cél
Két kritikus hiba javítása a provider endpointokban:
- PUT /providers/{id} → 404: A konténer nem volt újraindítva a providers modul kódváltoztatásai után
- GET /providers/search → 500:
.astexthiba JSONB subscripten + UNION oszlopszám mismatch - Multi-source update: Az
update_providercsak Organization-ben keresett, de a search 3 forrást használ
🔧 Változtatások
1. BACKEND - provider_service.py:207:
.astext→cast()javítás:Organization.external_integration_config["source"].astext→cast(Organization.external_integration_config["source"], String)- Root cause: JSON oszlop subscript-je
BinaryExpression-t ad vissza, amelyen nincs.astext
2. BACKEND - provider_service.py:232-274:
- UNION oszlopszám mismatch javítva: staging és crowd SELECT-ekhez hozzáadva a hiányzó
contact_phone,contact_email,website,specialization_tagsmezők (14 oszlopra egységesítve)
3. BACKEND - provider_service.py:477-622:
- Multi-source update logika:
update_provider()most már mindhárom forrást támogatja:fleet.organizations(verified orgs) - közvetlen frissítésmarketplace.service_staging(robot adatok) - migrálás Organization-bemarketplace.service_providers(crowdsourced) - migrálás Organization-be
4. INFRA - pre_start.sh:
- Dokumentálva: a
uvicorn--reloadnélkül fut, kódváltoztatás utándocker compose restart sf_apiszükséges
5. BACKEND - provider_service.py:578-596:
- Adatvédelmi javítás (2026-06-17): A címmezők (
address_city,address_zip,address_street_name,address_street_type,address_house_number) most már csak akkor íródnak felül, ha a frontend explicit nem-nullértéket küld. Ez megakadályozza, hogy a meglévő címadatok véletlenülnull-ra állítódjanak, amikor a felhasználó csak más mezőket szerkeszt. - Trigger: A Gitea kártya visszautasításra került (
deniedstátusz) a felhasználó által: "az adatok tárolása minden esetben bontottan történjen meg és ha hiányzik valamelyik az alap cím tárolási adatból akkor vissza kell tenni."
✅ Verifikáció
- PUT /providers/58: 200 OK ✅
- PUT /providers/58 (partial update - csak zip): 200 OK ✅ (többi mező nem nullázódik)
- GET /providers/search?q=Dunakeszi: 200 OK ✅ (2 provider)
- GET /providers/categories: 200 OK ✅ (11 categories)
- Login: 200 OK ✅
2026-06-17 - i18n: Hiányzó provider címmező fordítások hozzáadása
🎯 Cél
A ProviderEditModal.vue 6 darab provider.* i18n kulcsa hiányzott mindkét nyelvi modulból (hu.ts, en.ts), így a felhasználói felületen a kulcsnevek (pl. provider.streetNameLabel) jelentek meg a lefordított szöveg helyett.
🔧 Változtatások
1. FRONTEND - hu.ts:
provider.streetNameLabel:'Utca neve'provider.streetNamePlaceholder:'Pl. Egressy'provider.streetTypeLabel:'Közterület jellege'provider.streetTypePlaceholder:'Válassz típust...'provider.houseNumberLabel:'Házszám'provider.houseNumberPlaceholder:'Pl. 4'
2. FRONTEND - en.ts:
provider.streetNameLabel:'Street Name'provider.streetNamePlaceholder:'e.g. Egressy'provider.streetTypeLabel:'Street Type'provider.streetTypePlaceholder:'Select type...'provider.houseNumberLabel:'House Number'provider.houseNumberPlaceholder:'e.g. 4'
✅ Verifikáció
- Mindkét i18n fájl szintaktikailag helyes (Node.js require sikeres)
- A ProviderEditModal.vue összes
t('provider.*')hívása le van fedve
2026-06-17 - "Dunakeszi, Dunakeszi" duplikáció javítása + irányítószám megjelenítés
🎯 Cél
A szervizkereső oldalon a kártyán "Dunakeszi, Dunakeszi" duplikált városnév jelent meg, mert a backend address mezője megegyezett a city mezővel. A részletes nézetből hiányzott az irányítószám.
🔧 Változtatások
1. BACKEND - provider_service.py:
- Az
addressmezőtOrganization.address_city.label("address")-rőlfunc.concat(...)-re változtattuk, ami az összes atomizált címmezőt (irányítószám, város, utca, közterület, házszám) fűzi össze. - Példa eredmény:
"2120 Dunakeszi, Egressy utca 4"a korábbi"Dunakeszi"helyett.
2. FRONTEND - ServiceFinderView.vue:
- Új
formatCardAddress(provider)metódus, ami a kártyán az atomizált címmezőkből építi fel a címet. - Fallback: ha nincs atomizált adat, a backend által összefűzött
addressmezőt használja.
3. FRONTEND - ProviderDetailModal.vue:
- A
formattedAddresscomputed property most már tartalmazza azaddress_zipmezőt is. - Formátum:
"2120 Dunakeszi, Egressy utca 4"
✅ Verifikáció
- Backend API:
GET /api/v1/providers/search?city=Dunakeszi→address="2120 Dunakeszi, Egressy utca 4"✅ - Backend API: Autónyíri Kft. (id=58) →
address_zip=2120,address_street_name=Egressy,address_street_type=utca,address_house_number=4✅ - Frontend build:
npm run buildsikeres, 0 hiba ✅ - Backend konténer újraindítva:
docker compose restart sf_api✅
2026-06-17 - Kártya fő szolgáltatás (category) mindig megjelenítése
🎯 Cél
A szervizkereső kártyákon a fő szolgáltatás (category) mindig látszódjon. Ha van, akkor a kategória neve, ha nincs, akkor egy szaggatott vonalú placeholder.
🔧 Változtatások
1. FRONTEND - ServiceFinderView.vue:263:
- A category badge
v-if="provider.category"helyettv-if/v-elseszerkezet:- Ha van category:
bg-sf-accent/10háttér,text-sf-accentszín - Ha nincs: szaggatott vonalú (
border-dashed) placeholder "Nincs kategória" / "No category"
- Ha van category:
2. FRONTEND - hu.ts:1237:
serviceFinder.noCategory:'Nincs kategória'
3. FRONTEND - en.ts:1237:
serviceFinder.noCategory:'No category'
✅ Verifikáció
- Frontend build:
npm run buildsikeres, 0 hiba ✅