Compare commits

...

17 Commits

Author SHA1 Message Date
Sándor Máté Magony
402fd56668 Végleg kész 2025-05-12 17:44:28 +02:00
Sándor Máté Magony
3e0206c02b Leadásra készen 2025-05-12 17:27:50 +02:00
Sándor Máté Magony
7ace5e683b Leadásra kész 2025-05-12 17:21:14 +02:00
Sándor Máté Magony
8288e5d345 Kész(?????) 2025-05-12 14:44:52 +02:00
Sándor Máté Magony
edcfe3cf55 KÉSZ 2025-05-12 09:51:35 +02:00
Sándor Máté Magony
213b0d9008 Mostmár tényleg kész 2025-05-12 09:19:04 +02:00
Sándor Máté Magony
a85c207b44 Kész(?) 2025-05-11 13:07:54 +02:00
ec057787fd README.md frissítve 2025-05-08 12:43:48 +00:00
0da78f4fc9 README.md frissítve 2025-05-06 18:30:30 +00:00
ca3ef2c611 README.md frissítve 2025-05-06 15:55:34 +00:00
b60930016f README.md frissítve 2025-05-05 13:13:18 +00:00
2b17cb6421 README.md frissítve 2025-05-05 13:09:22 +00:00
4a9304dbe2 README.md frissítve 2025-05-05 13:07:30 +00:00
8cb89c5009 README.md frissítve 2025-05-05 13:06:56 +00:00
ed556b5098 README.md frissítve 2025-05-05 13:06:32 +00:00
Sándor Máté Magony
df51a10c12 Merge branch 'main' of https://git.gszi.edu.hu/magonysandormate/PeePal 2025-05-05 13:18:39 +02:00
Sándor Máté Magony
11067d20f0 Asszem kész 2025-05-05 13:17:26 +02:00
21 changed files with 107 additions and 246 deletions

View File

@@ -1,43 +0,0 @@
--Létrehozás
CREATE DATABASE IF NOT EXISTS peepal DEFAULT CHARACTER SET utf8 COLLATE utf8_hungrian_ci;
--Táblalétrehozás
CREATE TABLE IF NOT EXISTS wc_adatok (
id INT AUTO_INCREMENT PRIMARY KEY,
nev VARCHAR(250),
kerulet VARCHAR(250),
kozeli_megall VARCHAR(250),
akadalym BOOLEAN,
ar INT,
nyitva VARCHAR(250),
hossz_koord DOUBLE,
szel_koord DOUBLE,
utvonal VARCHAR(1000)
);
--Adatfeltöltés
INSERT INTO wc_adatok (nev, kerulet, kozeli_megall, akadalym, ar, nyitva, hossz_koord, szel_koord, utvonal) VALUES
('Déli Pályaudvar Nyilvános Mosdó', 'I. kerület', 'Déli Pályaudvar (M2-es metró, 2-es villamos, 4-es villamos, 18-as villamos, 59-es villamos, 61-es villamos)', TRUE, 250, '6:00-20:00', 47.50025507357977, 19.025074759382747, 'https://maps.app.goo.gl/X3TSMUwhTV4fALyd6'),
('Nyugati Pályaudvar Nyilvános Mosdó', 'VI. kerület', 'Nyugati Pályaudvar (M3-as metró, 4-es villamos, 6-os villamos)', TRUE, 200, '5:00-23:00', 47.510861527052484, 19.057794223722723, 'https://maps.app.goo.gl/z73zXwGX6HxkPNQu8'),
('Keleti Pályaudvar Nyilvános Mosdó', 'VIII. kerület', 'Keleti Pályaudvar (M2-es metró, M4-es metró, 7-es busz, 30-as busz, 78-as busz)', TRUE, 300, '0:00-24:00', 47.499972, 19.082667, 'https://maps.app.goo.gl/YBY2qVcbxZ9ebc7t8'),
('Margitszigeti Nyilvános Mosdó', 'XIII. kerület', 'Margitsziget (26-os busz)', TRUE, 150, '7:00-22:00', 47.518553, 19.044224, 'https://maps.app.goo.gl/V8azExcDm1weqrBU6'),
('Városligeti Nyilvános Mosdó', 'XIV. kerület', 'Városliget (70-es troli, 75-ös troli, 79-es troli)', TRUE, 200, '6:00-21:00', 47.51098933275473, 19.086019177929227, 'https://maps.app.goo.gl/yMVYSfZqQ9U7ZHLTA'),
('Széll Kálmán téri Nyilvános Mosdó', 'II. kerület', 'Széll Kálmán tér (M2-es metró, 4-es villamos, 6-os villamos, 17-es villamos, 56-os villamos, 59-es villamos, 61-es villamos)', TRUE, 250, '6:00-20:00', 47.50740741462604, 19.024610790375228, 'https://maps.app.goo.gl/Mjip13V5G4BN8rPj6'),
('Blaha Lujza téri Nyilvános Mosdó', 'VIII. kerület', 'Blaha Lujza tér (M2-es metró, 4-es villamos, 6-os villamos)', TRUE, 200, '5:00-23:00', 47.496403892547505, 19.068833611658484, 'https://maps.app.goo.gl/GuoNNjJjXcRW3914A'),
('Astoria Nyilvános Mosdó', 'V. kerület', 'Astoria (M2-es metró, 7-es busz, 8E busz, 112-es busz)', TRUE, 250, '6:00-20:00', 47.494151232460275, 19.05985662145968, 'https://maps.app.goo.gl/TW2ZwH7YiMpMMzSb7'),
('Kálvin téri Nyilvános Mosdó', 'IX. kerület', 'Kálvin tér (M3-as metró, M4-es metró, 47-es villamos, 48-as villamos, 49-es villamos)', TRUE, 200, '5:00-23:00', 47.48960659445002, 19.061634424103033, 'https://maps.app.goo.gl/TXY9EZdqfG2tXMru6'),
('Fővám téri Nyilvános Mosdó', 'IX. kerület', 'Fővám tér (M4-es metró, 47-es villamos, 48-as villamos, 49-es villamos)', TRUE, 250, '6:00-20:00', 47.4861911566426, 19.059586662994935, 'https://maps.app.goo.gl/WH3fCiWs8vnckFRz6'),
('Deák Ferenc téri Nyilvános Mosdó', 'V. kerület', 'Deák Ferenc tér (M1-es metró, M2-es metró, M3-as metró, 47-es villamos, 48-as villamos, 49-es villamos)', TRUE, 200, '5:00-23:00', 47.498069146347675, 19.053907077736074, 'https://maps.app.goo.gl/aGpFrnKszDEFeYdt7'),
('Ferenciek tere Nyilvános Mosdó', 'V. kerület', 'Ferenciek tere (M3-as metró, 7-es busz, 8E busz, 112-es busz)', TRUE, 250, '6:00-20:00', 47.4931164079512, 19.055890504323266, 'https://maps.app.goo.gl/6PfPvTVxSipzBhuZ7'),
('Kossuth Lajos téri Nyilvános Mosdó', 'V. kerület', 'Kossuth Lajos tér (M2-es metró, 2-es villamos)', TRUE, 200, '5:00-23:00', 47.505472668809034, 19.046749164211178, 'https://maps.app.goo.gl/EKAQR7uj5LVsZy4x5'),
('Batthyány téri Nyilvános Mosdó', 'I. kerület', 'Batthyány tér (M2-es metró, 19-es villamos, 41-es villamos)', TRUE, 250, '6:00-20:00', 47.50660730946977, 19.039155411436823, 'https://maps.app.goo.gl/t8hinEkANUqhMWRw5'),
('Móricz Zsigmond körtéri Nyilvános Mosdó', 'XI. kerület', 'Móricz Zsigmond körtér (M4-es metró, 6-os villamos, 7-es busz, 19-es villamos, 41-es villamos, 47-es villamos, 49-es villamos)', TRUE, 200, '5:00-23:00', 47.477323272765794, 19.047051394186987, 'https://maps.app.goo.gl/fd7wdgKJ9s5nC7pVA'),
('Oktogon Nyilvános Mosdó', 'VI. kerület', 'Oktogon (M1-es metró, 4-es villamos, 6-os villamos)', TRUE, 200, '5:00-23:00', 47.505250575621616, 19.061415791523817, 'https://maps.app.goo.gl/HeNeMXcNwu2ZPzKH8'),
('Hősök tere Nyilvános Mosdó', 'XIV. kerület', 'Hősök tere (M1-es metró, 75-ös troli, 79-es troli)', TRUE, 250, '6:00-20:00', 47.51373662991904, 19.080080605229554, 'https://maps.app.goo.gl/LbgvLsMUJSdDE7Sq9'),
('Népliget Nyilvános Mosdó', 'X. kerület', 'Népliget (M3-as metró, 1-es villamos)', TRUE, 200, '5:00-23:00', 47.47544930399268, 19.09925596186508, 'https://maps.app.goo.gl/Qsq5sFJRfqKmB5Er7'),
('Kelenföldi Pályaudvar Nyilvános Mosdó', 'XI. kerület', 'Kelenföldi Pályaudvar (M4-es metró, 19-es villamos, 49-es villamos)', TRUE, 250, '6:00-20:00', 47.463951751942105, 19.023199196825974, 'https://maps.app.goo.gl/ofKLMzZePzkQDRv97'),
('Újpest-Központ Nyilvános Mosdó', 'IV. kerület', 'Újpest-Központ (M3-as metró, 12-es villamos, 14-es villamos)', TRUE, 200, '5:00-23:00', 47.56152337335255, 19.09003531432967, 'https://maps.app.goo.gl/j3hEnc35djGJR3tx6'),
('Puskás Ferenc Stadion Nyilvános Mosdó', 'XIV. kerület', 'Puskás Ferenc Stadion (M2-es metró, 1-es villamos)', TRUE, 250, '6:00-20:00', 47.50357893256982, 19.10278532843446, 'https://maps.app.goo.gl/obJbWh81c7TSnwXC7'),
('Köki Terminál Nyilvános Mosdó', 'XIX. kerület', 'Köki Terminál (M3-as metró, 200E busz)', TRUE, 200, '5:00-23:00', 47.46277428339623, 19.14711616498906, 'https://maps.app.goo.gl/EJvn53JsSUwQNuRo6'),
('Bikás park Nyilvános Mosdó', 'XI. kerület', 'Bikás park (M4-es metró, 7E busz, 103-as busz)', TRUE, 200, '5:00-23:00', 47.46569504698277, 19.029679418269968, 'https://maps.app.goo.gl/WVxmBkv5cVp3z2ZG9');

View File

@@ -1,8 +0,0 @@
("1012 Budapest, Déli Pályaudvar", "I. kerület", "Déli Pályaudvar M", "true", 250, "18:00-06:00", 47.50025507357977, 19.025074759382747)
("1028 Budapest, Hársakalja", "II.kerület", "Bátori László utca", true, 250, "0:00-24:00", 47.544933, 18.964085)
("1033 Budapest, K-híd", "III. kerület", "Filatorigát", true, 250, "0:00-24:00", 47.552565, 19.048188)
("1042 Budapest József Attila u. 58", "IV. kerület", "Újpest-központ M", false, 250, "7:00-19:00", 47.560998, 19.089109)
("1051 Budapest, Deák Ferenc tér", "V. kerület", "Deák Ferenc tér M", false, 250, "7:00-19:00", 47.497573, 19.053831)
("1068 Budapest, Lövölde tér 5", "VI. kerület", "Lövölde tér", false, "0:00-24:00", 47.507366, 19.071631)
("1071 Budapest, Betlehen Gábor tér 2", "VII. kerület", "Nefelejcs utca / István utca", true, 250, "0:00-24:00", 47.503757, 19.079625)
("1082 Budapest, Fotó utca 29", "VIII. kerület", "Corvin-negyed M", false, 250, "6:00-18:00", 47.486795, 19.074694)

View File

@@ -35,7 +35,7 @@ class AuthController extends Controller
'nev' => $request->nev, 'nev' => $request->nev,
'email' => $request->email, 'email' => $request->email,
'felh_nev' => $request->felh_nev, 'felh_nev' => $request->felh_nev,
'jelszo' => $request->jelszo, // This will be hashed via the mutator 'jelszo' => $request->jelszo,
'is_admin' => $request->is_admin ?? false 'is_admin' => $request->is_admin ?? false
]); ]);
@@ -56,10 +56,9 @@ class AuthController extends Controller
return response()->json($validator->errors(), 422); return response()->json($validator->errors(), 422);
} }
// Since your login fields are custom, you need to specify the fields
$credentials = [ $credentials = [
'felh_nev' => $request->felh_nev, 'felh_nev' => $request->felh_nev,
'password' => $request->jelszo // Laravel expects 'password' internally 'password' => $request->jelszo
]; ];
if (!$token = auth('api')->attempt($credentials)) { if (!$token = auth('api')->attempt($credentials)) {
@@ -96,7 +95,7 @@ class AuthController extends Controller
return response()->json([ return response()->json([
'access_token' => $token, 'access_token' => $token,
'token_type' => 'bearer', 'token_type' => 'bearer',
'expires_in' => config('jwt.ttl') * 60, // Getting TTL from config 'expires_in' => config('jwt.ttl') * 60,
'user' => auth('api')->user() 'user' => auth('api')->user()
]); ]);
} }

View File

@@ -1,100 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\WcAdatok;
use Illuminate\Http\Request;
class HozzaadasController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validatedData = $request -> validate([
'nev' => 'required|string',
'kerulet' => 'required|string',
'kozeli_megall' => 'required|string',
'akadalym' => 'nullable|boolean',
'ar' => 'nullable|numeric',
'nyitva' => 'nullable|string',
'utvonal' => 'required|string',
'koordinatak' => 'required|string'
]);
try {
$szelesseg = null;
$hosszusag = null;
if (!empty($validatedData['koordinatak'])) {
$koordinatak = explode(',', $validatedData['koordinatak']);
if (count($koordinatak) == 2) {
$hosszusag = trim($koordinatak[0]);
$szelesseg = trim($koordinatak[1]);
if (!is_numeric($szelesseg) || !is_numeric($hosszusag)) {
return response() -> json([
'message' => 'Érvénytelen a koordináták formátuma'
], 422);
}
}
}
$mosdo = WcAdatok::create([
'nev' => $validatedData['nev'],
'kerulet' => $validatedData['kerulet'],
'kozeli_megall' => $validatedData['kozeli_megall'],
'akadalym' => $validatedData['akadalym'],
'ar' => $validatedData['ar'],
'nyitva' => $validatedData['nyitva'],
'utvonal' => $validatedData['utvonal'],
'szel_koord' => $szelesseg,
'hossz_koord' => $hosszusag
]);
return response() -> json([
'message' => 'Sikeres rögzítés',
'data' => $mosdo
], 201);
} catch (\Exception $e) {
return response() -> json([
'message' => 'Hiba történt a mentés során',
'error' => $e -> getMessage()
], 500);
}
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@@ -8,17 +8,6 @@ use Illuminate\Support\Facades\Hash;
class UserController extends Controller class UserController extends Controller
{ {
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request) public function store(Request $request)
{ {
$validatedData = $request->validate([ $validatedData = $request->validate([
@@ -34,7 +23,7 @@ class UserController extends Controller
'nev' => $validatedData['nev'], 'nev' => $validatedData['nev'],
'email' => $validatedData['email'], 'email' => $validatedData['email'],
'felh_nev' => $validatedData['felh_nev'], 'felh_nev' => $validatedData['felh_nev'],
'jelszo' => $validatedData['jelszo'], // Will be hashed by mutator 'jelszo' => $validatedData['jelszo'],
'is_admin' => $validatedData['is_admin'] ?? false 'is_admin' => $validatedData['is_admin'] ?? false
]); ]);
@@ -49,28 +38,4 @@ class UserController extends Controller
], 500); ], 500);
} }
} }
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
} }

View File

@@ -4,9 +4,15 @@ namespace App\Http\Controllers;
use App\Models\WcAdatok; use App\Models\WcAdatok;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class WcController extends Controller class WcController extends Controller
{ {
public function __construct()
{
$this->middleware('auth:api')->only(['store', 'destroy']);
}
public function index() public function index()
{ {
$mosdok = WcAdatok::with('kerulet')->get(); $mosdok = WcAdatok::with('kerulet')->get();
@@ -56,7 +62,7 @@ class WcController extends Controller
'utvonal' => $validatedData['utvonal'], 'utvonal' => $validatedData['utvonal'],
'szel_koord' => $szelesseg, 'szel_koord' => $szelesseg,
'hossz_koord' => $hosszusag, 'hossz_koord' => $hosszusag,
'felhasznalo_id' => $validatedData['felhasznalo_id'] ?? null 'felhasznalo_id' => auth('api')->id()
]); ]);
return response()->json([ return response()->json([
@@ -104,6 +110,4 @@ class WcController extends Controller
return response()->json(['message' => 'Nem található'], 404); return response()->json(['message' => 'Nem található'], 404);
} }
} }
} }

View File

@@ -22,7 +22,6 @@ class User extends Authenticatable implements JWTSubject
return []; return [];
} }
// Change to match your migration
protected $table = 'felhasznalok'; protected $table = 'felhasznalok';
protected $fillable = [ protected $fillable = [
@@ -43,13 +42,11 @@ class User extends Authenticatable implements JWTSubject
'email_verified_at' => 'datetime', 'email_verified_at' => 'datetime',
]; ];
// This method tells Laravel to use jelszo field for passwords
public function getAuthPassword() public function getAuthPassword()
{ {
return $this->jelszo; return $this->jelszo;
} }
// Fix this to use 'jelszo' instead of 'password'
public function setJelszoAttribute($value) public function setJelszoAttribute($value)
{ {
$this->attributes['jelszo'] = \Illuminate\Support\Facades\Hash::make($value); $this->attributes['jelszo'] = \Illuminate\Support\Facades\Hash::make($value);

View File

@@ -6,9 +6,6 @@ use Illuminate\Support\Facades\Schema;
return new class extends Migration return new class extends Migration
{ {
/**
* Run the migrations.
*/
public function up(): void public function up(): void
{ {
Schema::create('keruletek', function (Blueprint $t) { Schema::create('keruletek', function (Blueprint $t) {
@@ -42,11 +39,10 @@ return new class extends Migration
}); });
} }
/**
* Reverse the migrations.
*/
public function down(): void public function down(): void
{ {
// Schema::dropIfExists('keruletek');
Schema::dropIfExists('felhasznalok');
Schema::dropIfExists('wc_adatok');
} }
}; };

View File

@@ -8,9 +8,6 @@ use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder class DatabaseSeeder extends Seeder
{ {
/**
* Seed the application's database.
*/
public function run(): void public function run(): void
{ {
$this -> call([ $this -> call([

View File

@@ -14,14 +14,22 @@ class FelhasznaloFeltoltes extends Seeder
*/ */
public function run(): void public function run(): void
{ {
DB::table('felhasznalok')->insert([ DB::table('felhasznalok')->insert([[
'nev' => 'Magony Sándor', 'nev' => 'Admin',
'email' => 'magonys2006@gmail.com', 'email' => 'admin@gmail.com',
'felh_nev' => 'admin', 'felh_nev' => 'admin',
'jelszo' => Hash::make('admin'), 'jelszo' => Hash::make('admin'),
'is_admin' => true, 'is_admin' => true,
'created_at' => now(), 'created_at' => now(),
'updated_at' => now() 'updated_at' => now()
]); ], [
'nev' => 'Felhasználó',
'email' => 'felhasznalo@gmail.com',
'felh_nev' => 'felhasznalo',
'jelszo' => Hash::make('felhasznalo'),
'is_admin' => false,
'created_at' => now(),
'updated_at' => now()
]]);
} }
} }

Binary file not shown.

View File

@@ -1,6 +1,6 @@
# PeePal # PeePal
Ez a projekt a Budapesti nyilvános mosdókat listázza ki, és egy funkciója, hogy megmutatja, melyik van a legközelebb a felhasználóhoz. A frontend React-ben, a backend pedig Laravel-ben készült. Ez a projekt a budapesti nyilvános mosdókat listázza ki, és egy funkciója, hogy megmutatja, melyik van a legközelebb a felhasználóhoz. A frontend React-ben, a backend pedig Laravel-ben készült.
## Funkciók ## Funkciók
@@ -10,28 +10,45 @@ Ez a projekt a Budapesti nyilvános mosdókat listázza ki, és egy funkciója,
## Telepítés és futtatás ## Telepítés és futtatás
### Backend
1. Klónozd a repository-t: 1. Klónozd a repository-t:
```bash ```bash
git clone https://git.gszi.edu.hu/magonysandormate/PeePal.git git clone https://git.gszi.edu.hu/magonysandormate/PeePal.git
``` ```
2. Lépj be a backend könyvtárába: 2. Nyisd meg a XAMPP Control Panel-t és indítsd el a MySQL és az Apache szervereket
### Backend
1. Lépj be a backend könyvtárába:
```bash ```bash
cd Backend/peepal_backend cd Backend/laravel9
``` ```
3. Telepítsd a szükséges függőségeket: 2. Telepítsd a szükséges függőségeket:
```bash ```bash
composer install composer install
``` ```
4. Futtasd az adatbázis migrációkat: Ha a `composer install` hibát dob a `ext-sodium` vagy más bővítmény miatt, előbb ellenőrizd:
- PHP verzió: 8.1 vagy újabb ajánlott
- Engedélyezve van-e a sodium extension (php.ini-ben: `extension=sodium`)
- Ha ezek ellenére sem működik, alternatív megoldás:
```bash
composer update
```
3. Futtasd az adatbázis migrációkat:
```bash ```bash
php artisan migrate php artisan migrate
``` ```
5. Indítsd el a Laravel szervert: 3. Töltsd fel adatokkal az adatbázist seeder-ek segítségével:
```bash
php artisan db:seed
```
4. Indítsd el a Laravel szervert:
```bash ```bash
php artisan serve php artisan serve
``` ```
5. Lépj ki a backend könyvtárból:
```bash
cd ../..
```
### Frontend ### Frontend

View File

@@ -9,7 +9,6 @@ export function AuthProvider({ children }) {
const API_URL = 'http://localhost:8000/api'; const API_URL = 'http://localhost:8000/api';
useEffect(() => { useEffect(() => {
// Check if user is logged in on page load
const token = localStorage.getItem('token'); const token = localStorage.getItem('token');
if (token) { if (token) {
fetchUserData(token); fetchUserData(token);

View File

@@ -19,10 +19,18 @@ export default function Bejelentkezes() {
return; return;
} }
const success = await login(felhNev, jelszo); try {
if (success) { const success = await login(felhNev, jelszo);
navigate('/'); if (success) {
navigate('/');
} else {
setError('Hibás felhasználónév vagy jelszó.');
}
} catch (error) {
setError('Hibás felhasználónév vagy jelszó.');
} }
}; };
return ( return (

View File

@@ -1,5 +1,5 @@
import { useState } from 'react'; import { useState } from 'react';
import { useAuth } from './AuthContext'; // Update this path import { useAuth } from './AuthContext';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
export default function Regisztracio() { export default function Regisztracio() {
@@ -26,7 +26,6 @@ export default function Regisztracio() {
e.preventDefault(); e.preventDefault();
setErrors({}); setErrors({});
// Basic validation
const newErrors = {}; const newErrors = {};
if (!formData.nev) newErrors.nev = 'A név megadása kötelező'; if (!formData.nev) newErrors.nev = 'A név megadása kötelező';
if (!formData.email) newErrors.email = 'Az email megadása kötelező'; if (!formData.email) newErrors.email = 'Az email megadása kötelező';
@@ -43,9 +42,8 @@ export default function Regisztracio() {
const result = await register(formData); const result = await register(formData);
if (result.success) { if (result.success) {
navigate('/bejelentkezes'); // Navigate to login page after successful registration navigate('/bejelentkezes');
} else if (result.errors) { } else if (result.errors) {
// Format Laravel validation errors
const serverErrors = {}; const serverErrors = {};
for (const key in result.errors) { for (const key in result.errors) {
if (Array.isArray(result.errors[key])) { if (Array.isArray(result.errors[key])) {

View File

@@ -25,16 +25,17 @@ export default function Csempe() {
}, []); }, []);
function mosdoTorles(mosdoId){ function mosdoTorles(mosdoId){
const token = localStorage.getItem("token");
fetch("http://localhost:8000/api/mosdotorles/" + mosdoId, { fetch("http://localhost:8000/api/mosdotorles/" + mosdoId, {
method: "DELETE", method: "DELETE",
header: { headers: {
"Accept" : "application/json", "Accept" : "application/json",
"Content-Type" : "application/json" "Content-Type" : "application/json",
"Authorization": `Bearer ${token}`
} }
}) })
.then(response => { .then(response => {
if (response.ok) { if (response.ok) {
// Sikeres törlés után szűrd ki az adott elemet a state-ből
setMosdok(prev => prev.filter(m => m.id !== mosdoId)); setMosdok(prev => prev.filter(m => m.id !== mosdoId));
} else { } else {
console.error("Törlés sikertelen"); console.error("Törlés sikertelen");

View File

@@ -29,7 +29,7 @@ describe('Csempe komponens', () => {
]; ];
beforeEach(() => { beforeEach(() => {
fetch.resetMocks?.(); // ha használsz jest-fetch-mock-ot fetch.resetMocks?.();
jest.clearAllMocks(); jest.clearAllMocks();
}); });
@@ -68,9 +68,9 @@ describe('Csempe komponens', () => {
test('Betöltés alatt megjelenik spinner', async () => { test('Betöltés alatt megjelenik spinner', async () => {
useAuth.mockReturnValue({ user: { is_admin: true } }); useAuth.mockReturnValue({ user: { is_admin: true } });
fetchModule.mosdokFetch.mockImplementation(() => new Promise(() => {})); // never resolves fetchModule.mosdokFetch.mockImplementation(() => new Promise(() => {}));
render(<Csempe />); render(<Csempe />);
expect(screen.getByRole('status')).toBeInTheDocument(); // a spinner div-ben legyen pl. role="status" expect(screen.getByRole('status')).toBeInTheDocument();
}); });
}); });

View File

@@ -17,7 +17,6 @@ export default function HozzaadForm() {
const handleSubmit = async (event) => { const handleSubmit = async (event) => {
event.preventDefault(); event.preventDefault();
// Validáció: egyszerű kötelező mező ellenőrzések
const newErrors = {}; const newErrors = {};
if (!nev.trim()) newErrors.nev = "A név megadása kötelező."; if (!nev.trim()) newErrors.nev = "A név megadása kötelező.";
if (!kerulet_id) newErrors.kerulet_id = "Kerület kiválasztása kötelező."; if (!kerulet_id) newErrors.kerulet_id = "Kerület kiválasztása kötelező.";
@@ -38,14 +37,17 @@ export default function HozzaadForm() {
ar, ar,
nyitva, nyitva,
utvonal, utvonal,
koordinatak, koordinatak
felhasznalo_id: null
}; };
try { try {
const token = localStorage.getItem("token");
const response = await fetch("http://localhost:8000/api/hozzaadas", { const response = await fetch("http://localhost:8000/api/hozzaadas", {
method: "POST", method: "POST",
headers: { "Content-Type": "application/json" }, headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${token}`
},
body: JSON.stringify(wcInfo) body: JSON.stringify(wcInfo)
}); });
@@ -95,7 +97,7 @@ export default function HozzaadForm() {
}; };
return ( return (
<div className="flex justify-center items-center min-h-screen bg-yellow-100"> <div className="flex justify-center items-center min-h-screen bg-yellow-100 my-12">
<form onSubmit={handleSubmit} className="bg-white p-6 rounded-lg shadow-lg w-96 space-y-4"> <form onSubmit={handleSubmit} className="bg-white p-6 rounded-lg shadow-lg w-96 space-y-4">
<h2 className="text-2xl font-bold text-center">Adjon hozzá nyilvános mosdót, ha nem találja az oldalon</h2> <h2 className="text-2xl font-bold text-center">Adjon hozzá nyilvános mosdót, ha nem találja az oldalon</h2>
@@ -148,9 +150,11 @@ export default function HozzaadForm() {
type="text" type="text"
value={nyitva} value={nyitva}
onChange={(e) => setNyitva(e.target.value)} onChange={(e) => setNyitva(e.target.value)}
pattern="^((([0-1]?[0-9])|(2[0-3])):[0-5][0-9])-(?:(24:00)|(([0-1]?[0-9]|2[0-3]):[0-5][0-9]))$"
className="w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500" className="w-full px-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder="Nyitvatartás (Óra:Perc-Óra:Perc)" placeholder="Nyitvatartás (Óra:Perc-Óra:Perc)"
/> />
{errors.nyitva && <p className="text-red-600 text-sm">{errors.nyitva}</p>}
<fieldset className="mt-4"> <fieldset className="mt-4">
<legend className="block text-gray-700">Akadálymentes:</legend> <legend className="block text-gray-700">Akadálymentes:</legend>

View File

@@ -2,11 +2,10 @@ import React, { useState } from 'react';
import { TfiWheelchair } from "react-icons/tfi"; import { TfiWheelchair } from "react-icons/tfi";
import { mosdokFetch } from '../../apiFetch'; import { mosdokFetch } from '../../apiFetch';
// Egyszerű koordináta-alapú távolság (nincs konverzió km-re)
const calculateDistance = (lat1, lon1, lat2, lon2) => { const calculateDistance = (lat1, lon1, lat2, lon2) => {
const dx = lat1 - lat2; const dx = lat1 - lat2;
const dy = lon1 - lon2; const dy = lon1 - lon2;
return dx * dx + dy * dy; // távolság négyzete (nem baj, hogy nincs gyök alatt) return dx * dx + dy * dy;
}; };
export default function LegkozelebbiMosdo() { export default function LegkozelebbiMosdo() {

View File

@@ -1,4 +1,4 @@
import Csempe from "../Budi_Blokk/Csempe"; import Csempe from "../Csempe/Csempe";
import Fejlec from "../Fejlec/Fejlec"; import Fejlec from "../Fejlec/Fejlec";
import HozzaadGomb from "../Hozzadas/HozzaadGomb"; import HozzaadGomb from "../Hozzadas/HozzaadGomb";

View File

@@ -1,6 +1,6 @@
import { useState } from "react"; import { useState } from "react";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { Menu, X } from "lucide-react"; import { Menu, X, User } from "lucide-react";
import { useAuth } from "../Bejel_Regisz/AuthContext"; import { useAuth } from "../Bejel_Regisz/AuthContext";
export default function Menusor() { export default function Menusor() {
@@ -29,18 +29,30 @@ export default function Menusor() {
}`} }`}
> >
<li> <li>
<Link to="/kereso" className="hover:bg-yellow-500 px-4 py-2 rounded-lg transition"> <Link
to="/kereso"
className="hover:bg-yellow-500 px-4 py-2 rounded-lg transition"
onClick={() => setMenuOpen(false)}
>
Legközelebbi mosdó Legközelebbi mosdó
</Link> </Link>
</li> </li>
<li className="hidden md:block border-l-2 border-amber-800 h-10"></li> <li className="hidden md:block border-l-2 border-amber-800 h-10"></li>
<li> <li>
<Link to="/bejelentkezes" className="hover:bg-yellow-500 px-4 py-2 rounded-lg transition"> <Link
to="/bejelentkezes"
className="hover:bg-yellow-500 px-4 py-2 rounded-lg transition"
onClick={() => setMenuOpen(false)}
>
Bejelentkezés Bejelentkezés
</Link> </Link>
</li> </li>
<li> <li>
<Link to="/regisztracio" className="hover:bg-yellow-500 px-4 py-2 rounded-lg transition"> <Link
to="/regisztracio"
className="hover:bg-yellow-500 px-4 py-2 rounded-lg transition"
onClick={() => setMenuOpen(false)}
>
Regisztráció Regisztráció
</Link> </Link>
</li> </li>
@@ -69,7 +81,11 @@ export default function Menusor() {
}`} }`}
> >
<li> <li>
<Link to="/kereso" className="hover:bg-yellow-500 px-4 py-2 rounded-lg transition"> <Link
to="/kereso"
className="hover:bg-yellow-500 px-4 py-2 rounded-lg transition"
onClick={() => setMenuOpen(false)}
>
Legközelebbi mosdó Legközelebbi mosdó
</Link> </Link>
</li> </li>
@@ -85,6 +101,10 @@ export default function Menusor() {
Kijelentkezés Kijelentkezés
</button> </button>
</li> </li>
<li className="flex items-center space-x-2 px-4 py-2">
<User size={20} />
<span>{user.felh_nev}</span>
</li>
</ul> </ul>
</nav> </nav>
); );