Compare commits
15 Commits
df51a10c12
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
402fd56668 | ||
|
|
3e0206c02b | ||
|
|
7ace5e683b | ||
|
|
8288e5d345 | ||
|
|
edcfe3cf55 | ||
|
|
213b0d9008 | ||
|
|
a85c207b44 | ||
| ec057787fd | |||
| 0da78f4fc9 | |||
| ca3ef2c611 | |||
| b60930016f | |||
| 2b17cb6421 | |||
| 4a9304dbe2 | |||
| 8cb89c5009 | |||
| ed556b5098 |
@@ -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()
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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([
|
||||||
|
|||||||
@@ -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()
|
||||||
|
]]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
PeePal_Dokumentacio_2024-2025.pdf
Normal file
BIN
PeePal_Dokumentacio_2024-2025.pdf
Normal file
Binary file not shown.
33
README.md
33
README.md
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -19,10 +19,18 @@ export default function Bejelentkezes() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
const success = await login(felhNev, jelszo);
|
const success = await login(felhNev, jelszo);
|
||||||
if (success) {
|
if (success) {
|
||||||
navigate('/');
|
navigate('/');
|
||||||
|
} else {
|
||||||
|
setError('Hibás felhasználónév vagy jelszó.');
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
setError('Hibás felhasználónév vagy jelszó.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -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])) {
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user