This commit is contained in:
Torsten 2023-01-17 14:53:40 +01:00
commit fe284c2aa6
18 changed files with 1961 additions and 825 deletions

View file

@ -2,3 +2,8 @@
laravel new motorradig
cd motorradig
composer require laravel/ui --dev
mysql -ud0304938 -phubbabubba -h motorrad-ig.de d0304938

View file

@ -3,7 +3,7 @@ APP_ENV=local
APP_KEY=base64:7Md2wHHNq04ldtpdsz4B2LDAMEOB+4fSfxMJGfDU2zY=
APP_DEBUG=true
APP_URL=http://test.motorrad-ig.de
LOG_CHANNEL=stack
LOG_CHANNEL=daily
DB_CONNECTION=mysql
DB_HOST=127.0.0.1

View file

@ -52,6 +52,7 @@ class RegisterController extends Controller
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'mobile' => ['required', 'string', 'max:255'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
@ -67,6 +68,7 @@ class RegisterController extends Controller
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'mobile' => $data['mobile'],
'password' => Hash::make($data['password']),
]);
}

View file

@ -3,7 +3,9 @@
namespace App\Http\Controllers;
use App\Page;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class PageController extends Controller
{
@ -84,17 +86,23 @@ class PageController extends Controller
}
public function page_home() {
public function page_home()
{
$page = Page::where('name', 'home')->first();
$content = $page->content;
$content = rtrim(ltrim($content, '"'), '"');
$user = Auth::user();
if ($user) {
Log::info("Home page display for user " . $user->name . "[" . $user->id . "]");
}
return view('home')->with('content', $content);
}
public function page_activities() {
public function page_activities()
{
$page = Page::where('name', 'activities')->first();
$content = $page->content;
return view('activities')->with('content', $content);

View file

@ -149,7 +149,8 @@ class TourController extends Controller
* @return \Illuminate\Http\Response
*/
private function fetch_rooms($tour_id) {
private function fetch_rooms($tour_id)
{
// - all existing rooms with booked users (if any)
// - all users without room
$sql = "
@ -162,7 +163,7 @@ class TourController extends Controller
qry.free_slots,
COALESCE(qry.room_name,'Ungebucht') as room_name,
COALESCE(qry.room_name,'ZZZZZZZZZ') as room_sort_order
COALESCE(qry.room_id,'ZZZZZZZZZ') as room_sort_order
FROM
(
SELECT
@ -173,15 +174,16 @@ class TourController extends Controller
b.user_id,
(SELECT tr.capacity - count(*) from bookings where tour_id=tr.tour_id and room_id=tr.id) as free_slots
FROM
tour_rooms tr
LEFT JOIN bookings as b
tour_rooms tr LEFT JOIN bookings as b
ON b.tour_id = tr.tour_id AND b.room_id = tr.id
WHERE
tr.tour_id= " . $tour_id . "
) qry
LEFT JOIN users as u
ON qry.user_id = u.id
UNION
-- unbooked tour users
@ -205,20 +207,23 @@ class TourController extends Controller
b.user_id = u.id
AND
capacity is null
ORDER BY room_name, user_name
ORDER BY room_sort_order, user_name
;
";
$rooms = DB::select($sql);
Log::info("TourController.fetch_rooms, returning rooms result:");
Log::info($rooms);
//Log::info("TourController.fetch_rooms, returning rooms result:");
//Log::info($rooms);
return ($rooms);
}
public function edit(Tour $tour)
{
if (Auth::user()->role != 'ADMIN') {
return redirect('/tour');
}
error_log("Tour:edit");
if ($tour->start < Carbon::now()) {
return view('tour.edit_old')->with('tour', $tour);
@ -229,6 +234,7 @@ class TourController extends Controller
$rooms = $this->fetch_rooms($tour->id);
return view('tour.edit')
->with('tour', $tour)
->with('rooms', $rooms);
@ -299,7 +305,8 @@ class TourController extends Controller
}
*/
public function upload_gallery(Request $request, Tour $tour){
public function upload_gallery(Request $request, Tour $tour)
{
dd($request);
}
@ -315,20 +322,41 @@ class TourController extends Controller
//
}
public function join_room($tour_id,$room_id) {
public function join_room($tour_id, $room_id)
{
Log::info("TourController::join_room");
$user=Auth::user();
Tour::join_room($tour_id,$user->id, $room_id);
$user_id = Auth::user()->id;
Tour::join_room($tour_id, $user_id, $room_id);
return redirect('/tour/' . $tour_id);
}
public function cancelBooking($tour_id) {
public function join_room4user($tour_id, $room_id, $user_id)
{
Log::info("TourController::join_room");
Tour::join_room($tour_id, $user_id, $room_id);
$tour = Tour::find($tour_id);
$tour->start = Tour::toGermanDate($tour->start);
$tour->deadline = Tour::toGermanDate($tour->deadline);
$rooms = $this->fetch_rooms($tour->id);
return view('tour.edit')
->with('tour', $tour)
->with('rooms', $rooms);
return redirect('/tour/' . $tour_id);
}
public function cancelBooking($tour_id)
{
$user = Auth::user();
Booking::where('tour_id', $tour_id)->where('user_id', $user->id)->delete();
return redirect('/tour');
}
public function cancelBookingAdmin($tour_id, $user_id) {
public function cancelBookingAdmin($tour_id, $user_id)
{
$user = Auth::user();
if (Auth::user()->role == "ADMIN") {
Booking::where('tour_id', $tour_id)->where('user_id', $user_id)->delete();
@ -336,17 +364,20 @@ class TourController extends Controller
return redirect('/tour/' . $tour_id);
}
public function create_room($tour_id,$capacity) {
public function create_room($tour_id, $capacity)
{
Log::info("create_room Controller started");
$user = Auth::user();
Tour::create_room($tour_id, $capacity);
return redirect('tour/' . $tour_id . '/edit');
}
public function delete_room($tour_id,$room_id) {
public function delete_room($tour_id, $room_id)
{
Log::info("create_room Controller started");
$user = Auth::user();
Booking::where('tour_id', $tour_id)->where('room_id', $room_id)->delete();
DB::update("UPDATE bookings SET room_id=0 WHERE room_id=" . $room_id);
DB::delete("DELETE FROM tour_rooms WHERE tour_id = ? AND id = ?", [$tour_id, $room_id]);
return redirect('tour/' . $tour_id . '/edit');
}

View file

@ -4,6 +4,8 @@ namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Log;
use Intervention\Image\Facades\Image;
@ -34,17 +36,17 @@ class UserController extends Controller
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\User $user
* @return \Illuminate\Http\Response
* /
public function store(Request $request)
{
}
/**
* public function store(Request $request)
* {
*
* }
*
* /**
* Display the specified resource.
*
* @param \App\User $user
* @return \Illuminate\Http\Response
*/
public function show($id)
@ -67,9 +69,15 @@ class UserController extends Controller
*/
public function edit($id)
{
error_log("Edit:" . $id);
$user = User::find($id);
if (Auth::user()->role != 'ADMIN' && $user->id != Auth::user()->id) {
return redirect('/users');
}
error_log($user);
return view('users.edit')->with('user', $user);
}
@ -134,11 +142,23 @@ class UserController extends Controller
* @param \App\User $user
* @return \Illuminate\Http\Response
*/
public function destroy(User $user)
public function destroy($user_id)
{
//
$user = User::find($user_id);
Log::info("UserController::destroy for user_id " . $user->id);
Log::info("Preparing to destroy user [" . $user->id . "]" . $user->name);
Log::info("#DESTROY_USER [users]" . $user);
$tours = DB::select("SELECT id FROM tours WHERE user_id=" . $user_id);
Log::info('#DESTROY_USER [affected tour ids]', $tours);
$bookings = DB::select("SELECT id FROM bookings WHERE user_id=" . $user_id);
Log::info("#DESTROY_USER [affected booking ids]", $bookings);
DB::delete('DELETE FROM users WHERE id=' . $user->id);
return redirect('/member/');
}
}

View file

@ -10,25 +10,39 @@ use Log;
class Tour extends Model
{
protected $fillable = [
'id', 'name', 'beschreibung','user_id','start','deadline','is_cancelled', 'status'
'id', 'name', 'beschreibung', 'user_id', 'start', 'deadline', 'is_cancelled', 'status', 'bericht', 'max_participants'
];
public static function getBookings($tour_id) {
public static function getBookings($tour_id)
{
error_log("getBookings for tour_id: " . $tour_id);
$bookings = Booking::where('tour_id', $tour_id)->get();
return $bookings;
}
public static function has_participant($tour_id, $user_id) {
public static function has_participant($tour_id, $user_id)
{
$booking = Booking::where('tour_id', $tour_id)->where('user_id', $user_id)->first();
if ($booking) return true;
return false;
}
public static function has_space($tour_id)
{
//$tour = Tour::where("id", $tour_id)->get();
//Log::info($tour[0]);
$tour = Tour::find($tour_id);
//Log::info($tour);
$bookings = Booking::where('tour_id', $tour_id)->get();
if (count($bookings) >= $tour->max_participants) return false;
return true;
}
// new join with room parameter
public static function join_room($tour_id, $user_id, $room_id) {
public static function join_room($tour_id, $user_id, $room_id)
{
Log::info("Tour::join_room, tour_id=" . $tour_id . ", user_id=" . $user_id . ", room_id=" . $room_id);
$booking = Booking::firstOrCreate(
['tour_id' => $tour_id, 'user_id' => $user_id], // Retrieve if existing
@ -40,20 +54,25 @@ class Tour extends Model
//Log::info($booking);
}
public static function cancel($tour_id, $user_id) {
public static function cancel($tour_id, $user_id)
{
Booking::where('tour_id', $tour_id)->where('user_id', $user_id)->delete();
}
public static function is_over($tour_id) {
public static function is_over($tour_id)
{
$tour = Tour::find($tour_id);
if ($tour->start < Carbon::now()) return true;
return false;
}
public static function create_room($tour_id,$capacity) {
public static function create_room($tour_id, $capacity)
{
$tour = Tour::find($tour_id);
$name = "Einzelzimmer";
if ($capacity!=1) { $name="Doppelzimmer";}
if ($capacity != 1) {
$name = "Doppelzimmer";
}
$sql = "INSERT INTO tour_rooms (name,tour_id,capacity,created_at,updated_at) VALUES ('" . $name . "'," . $tour_id . "," . $capacity . ",now(),now());";
DB::insert($sql);
}

View file

@ -16,7 +16,7 @@ class User extends Authenticatable
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
'name', 'email', 'password','mobile'
];
/**
@ -37,9 +37,10 @@ class User extends Authenticatable
'email_verified_at' => 'datetime',
];
public static function has_tour($tour_id, $user_id) {
$tour=Tour::find($tour_id);
$user=User::first($user_id);
public static function has_tour($tour_id, $user_id)
{
// $tour=Tour::find($tour_id);
// $user=User::first($user_id);
$booking = Booking::where('tour_id', $tour_id)->where('user_id', $user_id);
if ($booking) return true;
return false;

View file

@ -39,6 +39,21 @@
</div>
</div>
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">Telefonnummer</label>
<div class="col-md-6">
<input id="mobile" type="text" class="form-control @error('mobile') is-invalid @enderror" name="mobile" value="{{ old('mobile') }}" required autocomplete="mobile">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">Passwort</label>

View file

@ -13,8 +13,8 @@
<div class="card-body">
<form style="background-color: #fff;" class="text-dark" method="post" action="/tour/{{$tour->id}}" enctype="multipart/form-data">
<form style="background-color: #fff;" class="text-dark" method="post"
action="/tour/{{$tour->id}}" enctype="multipart/form-data">
@csrf
@ -24,45 +24,59 @@
<div class="form-group" style="display:flex;">
<!-- label class="ml-2 mt-4 col-form-label col-form-label-sm" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label> -->
<label class="ml-2 mt-3 col-form-label col-form-label-sm" style="width:180px; text-align:left;font-size:18px;" for="name">Name:</label>
<input class="mt-3 mr-2 form-control input-sm" type="text" id="name" name="name" value="{{ old('name') ?? $tour->name }}" required >
<label class="ml-2 mt-3 col-form-label col-form-label-sm"
style="width:180px; text-align:left;font-size:18px;" for="name">Name:</label>
<input class="mt-3 mr-2 form-control input-sm" type="text" id="name" name="name"
value="{{ old('name') ?? $tour->name }}" required>
</div>
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-3" style="width:180px; text-align:left;font-size:18px;" for="name">Start:</label>
<input class="mt-3 mr-2 form-control input-sm" type="text" id="start" name="start" value="{{ $tour->start }}" required >
<label class="ml-2 mt-3" style="width:180px; text-align:left;font-size:18px;"
for="name">Start:</label>
<input class="mt-3 mr-2 form-control input-sm" type="text" id="start" name="start"
value="{{ $tour->start }}" required>
</div>
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:180px; text-align:left;font-size:18px;" for="deadline">Anmeldeschluss:</label>
<input class="mt-3 mr-2 form-control" type="text" id="deadline" style="font-size:16px;" name="deadline" value="{{ old('deadline') ?? $tour->deadline }}" required >
<label class="ml-2 mt-4" style="width:180px; text-align:left;font-size:18px;"
for="deadline">Anmeldeschluss:</label>
<input class="mt-3 mr-2 form-control" type="text" id="deadline" style="font-size:16px;"
name="deadline" value="{{ old('deadline') ?? $tour->deadline }}" required>
</div>
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:180px; text-align:left;font-size:18px;" for="name">Max Teilnehmer:</label>
<input class="mt-3 mr-2 form-control" type="text" id="max_participants" style="font-size:16px;" name="max_participants" value="{{ old('max_participants') ?? $tour->max_participants }}" required >
<label class="ml-2 mt-4" style="width:180px; text-align:left;font-size:18px;"
for="name">Max Teilnehmer:</label>
<input class="mt-3 mr-2 form-control" type="text" id="max_participants"
style="font-size:16px;" name="max_participants" type="number" min="1" max="99"
value="{{ old('max_participants') ?? $tour->max_participants }}" required>
</div>
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="bild" ><h4>Bild:</h4></label>
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="bild"><h4>Bild:</h4>
</label>
@if(file_exists (public_path ('img/tour/'.$tour->id.'.jpg')))
<!--File exists -->
<a href="/img/tour/{{$tour->id}}_gross.jpg" data-lightbox="{{$tour->id}}_gross.jpg" data-title="{{ $tour->name }}">
<a href="/img/tour/{{$tour->id}}_gross.jpg" data-lightbox="{{$tour->id}}_gross.jpg"
data-title="{{ $tour->name }}">
<img src="/img/tour/{{$tour->id}}.jpg" class="mt-3 ml-3">
</a>
@else
<img src="/img/placeholder/tour128x100.jpg" class="mt-3 ml-3">
@endif
<input type="file" class="mt-3 mr-2 form-control" id="bild" style="font-size:20px;" name="bild" value="" >
<input type="file" class="mt-3 mr-2 form-control" id="bild" style="font-size:20px;"
name="bild" value="">
</div>
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-3" style="width:140px; text-align:left;font-size:18px;" for="is_cancelled">Storniert:</label>
<input class="mt-3 mr-2 form-control" type="checkbox" id="is_cancelled" style="font-size:10px;width:20px;" name="is_cancelled"
<label class="ml-2 mt-3" style="width:140px; text-align:left;font-size:18px;"
for="is_cancelled">Storniert:</label>
<input class="mt-3 mr-2 form-control" type="checkbox" id="is_cancelled"
style="font-size:10px;width:20px;" name="is_cancelled"
@if($tour->is_cancelled)
checked
@endif
@ -76,10 +90,61 @@
</div>
<a href="/tour/{{$tour->id}}"><div type="submit" class="btn btn-success col-2 mb-2 float-right mr-2">Abbrechen</div></a>
<a href="/tour/{{$tour->id}}">
<div type="submit" class="btn btn-success col-2 mb-2 float-right mr-2">Abbrechen</div>
</a>
<button type="submit" class="btn btn-danger col-2 mb-2 float-right mr-2">Speichern</button>
</form>
<!-- Modal Anzeige start -->
<!-- The Modal -->
<div id="myModal" class="modal">
<!-- Modal content -->
<div class="modal-content">
<span class="close">&times;</span>
<h2>Bitte Zimmer auswählen</h2>
<!-- Teilnehmer+Raum Anzeige/Auswahl: Nur buchbare -->
<div class="card-body">
<ul>
<!-- Intentional Assignment ! -->
@if ($room_id="") @endif
@foreach($rooms as $room)
@if( $room->room_id != 0 and $room->free_slots >0)
<!-- Dont show "Ungebucht", room_id=0 and only with available slots -->
@if ($room_id != $room->room_id)
@if(strlen($room_id))
<hr/>
@endif
<p style="list-style-type: none;">[{{$room->room_id}}]
<span>{{$room->room_name}}
</span><b><a id="booking_link"
href="/tour/{{$tour->id}}/join4user/{{$room->room_id}}/#USER_ID">
==> Buchen</a></b>
</p>
<!-- Intentional Assignment ! -->
@if ($room_id=$room->room_id) @endif
@endif
@if(strlen($room->user_name))
<li> {{ $room->user_name}}
</li>
@endif
@endif
@endforeach
</ul>
</div>
</div>
</div>
<!--Modal Anzeige end -->
</div>
</div>
</div>
@ -89,46 +154,71 @@
<div class="card-header"><h5>Teilnehmer</h5></div>
<div class="card-body" >
<p>
<!-- Intentional Assignment ! -->
@if ($room_id="") @endif
@foreach($rooms as $room)
@if ($room_id != $room->room_id)
@if(strlen($room_id))
<hr/>
@if($room_id!="")
@if($room->room_name=="Ungebucht")
</div> <div style="height:30px;"></div>
@else
</div> <div style="height:2px;"></div>
@endif
<p><b>[{{$room->room_id}}] {{$room->room_name}}</b>
@if($room->room_id>0) <!-- Delete link only for real room ids -->
<a class="text-primary ts_tooltip" href="/tour/{{$tour->id}}/delete_room/{{$room->room_id}}">
@endif
<div style="border:solid;border-width:1px;">
<div><b>{{$room->room_name}}
@if( $room->room_name != "Ungebucht" )
<!-- Delete link only for real room ids -->
<a id="room_booking_link" class="text-primary ts_tooltip"
href="/tour/{{$tour->id}}/delete_room/{{$room->room_id}}">
(X) <span class="ts_tooltiptext">Raum Löschen</span>
</a>
@endif
</p>
</div>
<!-- Intentional Assignment ! -->
@if ($room_id=$room->room_id) @endif
@endif
@if(strlen($room->user_name))
<li style="list-style:none"> {{ $room->user_name}}
@if(Auth::user()->role=="ADMIN")
<a href="/tour/{{$tour->id}}/cancelBookingAdmin/{{$room->user_id}}" class="text-primary ts_tooltip">
<span class="ts_tooltiptext">Stornieren</span>
<div> &nbsp; {{ $room->user_name}}
@if( $room->room_name == "Ungebucht" )
<a href="#" data-user_id="{{$room->user_id}}" id="myBtn"
class="float-left ts_tooltip">
(+)
<span class="ts_tooltiptext">Zimmer zuweisen</span>
</a>
@else
<a href="/tour/{{$tour->id}}/join4user/0/{{$room->user_id}}"
class="float-left ts_tooltip">
(-)
<span class="ts_tooltiptext">Zimmer-Zuweisung löschen</span>
</a>
@endif
</li>
</div>
@endif
@endforeach
</ul>
</div> <div style="height:2px;"></div>
<div class="card-header">
<a href="/tour/{{$tour->id}}/create_room/1" class="text-primary">+ Einzelzimmer</a>
<p>
<a href="/tour/{{$tour->id}}/create_room/1" class="text-primary">+ Einzelzimmer
erstellen</a>
<!-- <button type="submit" class="btn">+ Einzelzimmer</button> -->
</div>
&nbsp;
<div class="card-header">
<a href="/tour/{{$tour->id}}/create_room/2" class="text-primary">+ Doppelzimmer</a>
</p>
<p>
<a href="/tour/{{$tour->id}}/create_room/2" class="text-primary">+ Doppelzimmer
erstellen</a>
<!-- <button type="submit" class="btn">+ Doppelzimmer</button> -->
</p>
</div>
</div>
</div>
@ -152,6 +242,66 @@
'format': 'dd.mm.yyyy',
'language': 'de'
});
//////////////////////////////////////////////////
// Get the modal
var modal = document.getElementById("myModal");
// Get the button that opens the modal
//var btn = document.getElementById("myBtn");
var btns = document.querySelectorAll("#myBtn");
for (let i = 0; i < btns.length; ++i) {
//btns[i].user_id=
btns[i].onclick = function (e) {
console.log("** CLICK **")
console.log(this)
let user_id = this.dataset.user_id
// Jetzt die Links
var elems = document.querySelectorAll("#booking_link")
for (var i = 0; i < elems.length; i++) {
console.log("Before: ")
console.log(elems[i].href)
elems[i].href = elems[i].href.replace("#USER_ID", user_id)
console.log("After:")
console.log(elems[i].href)
}
// When the user clicks on the button, open the modal
e.preventDefault();
modal.style.display = "block";
}
}
// Get the <span> element that closes the modal
var span = document.getElementsByClassName("close")[0];
// When the user clicks on <span> (x), close the modal, restore the links
span.onclick = function (e) {
e.preventDefault();
modal.style.display = "none";
// Jetzt die Links
var elems = document.querySelectorAll("#booking_link")
for (var i = 0; i < elems.length; i++) {
arr = elems[i].href.split("/")
arr.pop()
str = arr.join("/") + "/#USER_ID"
elems[i].href = str
}
}
// When the user clicks anywhere outside of the modal, close it
window.onclick = function (event) {
if (event.target == modal) {
modal.style.display = "none";
}
}
</script>
@endsection

View file

@ -2,13 +2,7 @@
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8 mt-2">
<div class="card mt-4">
@ -18,33 +12,41 @@
<div class="card-body">
<form style="background-color: #fff;" class="text-dark" method="post" action="" enctype="multipart/form-data">
<form style="background-color: #fff;" class="text-dark" method="post" action=""
enctype="multipart/form-data">
@csrf
<div class="" style="display:flex;">
<!-- label class="ml-2 mt-4 col-form-label col-form-label-sm" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label> -->
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Name:</label>
<input class="mr-1 form-control" type="text" id="name" name="name" value="{{ old('name') ?? $tour->name }}" readonly >
<input class="mr-1 form-control" type="text" id="name" name="name"
value="{{ old('name') ?? $tour->name }}" readonly>
</div>
<div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Start:</label>
<input class="mr-1 form-control" type="text" id="start" name="start" value="{{ old('start') ?? $tour->start }}" readonly >
<input class="mr-1 form-control" type="text" id="start" name="start"
value="{{ old('start') ?? $tour->start }}" readonly>
</div>
<div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="creator">Ansprechpartner:</label>
<input class="mr-1 form-control" type="text" id="creator" name="creator" value="{{ old('creator') ?? $creator->name }}" readonly >
<input class="mr-1 form-control" type="text" id="creator" name="creator"
value="{{ old('creator') ?? $creator->name }}" readonly>
</div>
<div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Anmeldeschluss:</label>
<input class="mr-1 form-control" type="text" id="anmeldeschluss" style="font-size:16px;" name="deadline" value="{{ old('anmeldeschluss') ?? $tour->deadline }}" readonly >
<input class="mr-1 form-control" type="text" id="anmeldeschluss" style="font-size:16px;"
name="deadline" value="{{ old('anmeldeschluss') ?? $tour->deadline }}" readonly>
</div>
<div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Max Teilnehmer:</label>
<input class="mr-1 form-control" type="text" id="max_participants" style="font-size:16px;" name="max_participants" value="{{ old('max_participants') ?? $tour->max_participants }}" required >
<label class="ml-2" style="width:180px; text-align:left;font-size:18px;" for="name">Max
Teilnehmer:</label>
<input class="mr-1 form-control" type="text" id="max_participants"
style="font-size:16px;" name="max_participants"
value="{{ old('max_participants') ?? $tour->max_participants }}" required>
</div>
@if(App\Tour::has_participant($tour->id, Auth::user()->id))
@ -56,7 +58,8 @@
@if(file_exists (public_path ('img/tour/'.$tour->id.'.jpg')))
<!--File exists -->
<a href="/img/tour/{{$tour->id}}_gross.jpg" data-lightbox="{{$tour->id}}_gross.jpg" data-title="{{ $tour->name }}">
<a href="/img/tour/{{$tour->id}}_gross.jpg" data-lightbox="{{$tour->id}}_gross.jpg"
data-title="{{ $tour->name }}">
<img src="/img/tour/{{$tour->id}}.jpg" class="mt-3 ml-3">
</a>
@else
@ -64,8 +67,10 @@
@endif
<div class="mt-1" style="display:flex;">
<label class="ml-2" style="width:140px; text-align:left;font-size:18px;" for="is_cancelled">Storniert:</label>
<input class="mr-1 form-control" type="checkbox" id="is_cancelled" style="font-size:10px;width:20px;" name="is_cancelled"
<label class="ml-2" style="width:140px; text-align:left;font-size:18px;"
for="is_cancelled">Storniert:</label>
<input class="mr-1 form-control" type="checkbox" id="is_cancelled"
style="font-size:10px;width:20px;" name="is_cancelled"
@if($tour->is_cancelled)
checked
@endif
@ -79,25 +84,27 @@
</div>
<!-- TODO: Only if owner or admin -->
<a href="/tour/{{$tour->id}}/edit"><div type="submit" class="btn btn-danger col-3 mb-2 float-left mr-2">Bearbeiten</div></a>
@if(Auth::user()->role=="ADMIN")
<a href="/tour/{{$tour->id}}/edit">
<div type="submit" class="btn btn-danger col-3 mb-2 float-left mr-2">Bearbeiten
</div>
</a>
@endif
<a href="/tour" type="submit" class="btn btn-success col-3 mb-2 float-right mr-2">Ok</a>
@if(!App\Tour::has_participant($tour->id, Auth::user()->id))
@if(!App\Tour::has_participant($tour->id, Auth::user()->id) && App\Tour::has_space($tour->id))
<!-- Connected to Modal -->
<button id="myBtn" class="btn btn-danger float-left">Teilnehmen</button>
@else
<a href="/tour/{{$tour->id}}/cancelBooking" type="submit" class="btn btn-danger col-3 mb-2 float-right mr-2">Absagen</a>
@endif
@if(App\Tour::has_participant($tour->id, Auth::user()->id))
<a href="/tour/{{$tour->id}}/cancelBooking" type="submit"
class="btn btn-danger col-3 mb-2 float-right mr-2">Absagen</a>
@endif
</form>
<!-- Modal Anzeige start -->
<!-- The Modal -->
<div id="myModal" class="modal">
@ -111,14 +118,16 @@
<!-- Intentional Assignment ! -->
@if ($room_id="") @endif
@foreach($rooms as $room)
@if( $room->room_id != 0 and $room->free_slots >0) <!-- Dont show "Ungebucht", room_id=0 and only with available slots -->
@if( $room->room_id != 0 and $room->free_slots >0)
<!-- Dont show "Ungebucht", room_id=0 and only with available slots -->
@if ($room_id != $room->room_id)
@if(strlen($room_id))
<hr/>
@endif
<p style="list-style-type: none;">[{{$room->room_id}}]
<span>{{$room->room_name}}
</span><b><a href="/tour/{{$tour->id}}/join/{{$room->room_id}}"> ==> Buchen</a></b>
</span><b><a href="/tour/{{$tour->id}}/join/{{$room->room_id}}">
==> Buchen</a></b>
</p>
<!-- Intentional Assignment ! -->
@ -138,8 +147,8 @@
</div>
</div>
<!--Modal Anzeige end -->
</div>
</div>
</div>
@ -150,32 +159,42 @@
<!-- Teilnehmer+Raum Anzeige -->
<div class="card-body">
<ul>
<!-- Intentional Assignment ! -->
@if ($room_id="") @endif
@foreach($rooms as $room)
@if ($room_id != $room->room_id)
@if(strlen($room_id))
<p>-------------------------</p>
@if($room_id!="")
@if($room->room_name=="Ungebucht")
</div>
<div style="height:30px;"></div>
@else
</div>
<div style="height:2px;"></div>
@endif
@endif
<div style="border:solid;border-width:1px;">
<div style="text-align:center;"><b>{{$room->room_name}}
@if( $room->room_name != "Ungebucht" )
_{{$room->room_id}}</b></div>
@endif
<p><b>[{{$room->room_id}}] {{$room->room_name}}</b></p>
<!-- Intentional Assignment ! -->
@if ($room_id=$room->room_id) @endif
@endif
@if(strlen($room->user_name))
<li style="list-style:none"> {{ $room->user_name}}
@if(Auth::user()->role=="ADMIN")
<a href="/tour/{{$tour->id}}/cancelBookingAdmin/{{$room->user_id}}" class="text-primary ts_tooltip">(X)
<span class="ts_tooltiptext">Stornieren</span>
</a>
@endif
</li>
<div style="list-style:none"> &nbsp; {{ $room->user_name}}
</div>
@endif
@endforeach
</ul>
</div>
<div style="height:2px;"></div>
</div>
</div>

View file

@ -4,22 +4,27 @@
<div class="container text-center text-light mt-5">
<h1 class="text-center">{{$user->name}}</h1>
<form style="background-color: #fff;" class="text-dark" method="post" action="/member/{{$user->name}}" enctype="multipart/form-data">
<form style="background-color: #fff;" class="text-dark" method="post" action="/member/{{$user->name}}"
enctype="multipart/form-data">
@csrf
@method('PUT')
<input type="hidden" name="id" value="{{ $user->id }}">
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="name"><h4>Name:</h4></label>
<input class="mt-3 mr-2 form-control" type="text" id="name" style="font-size:20px;" name="name" value="{{ old('name') ?? $user->name }}" required >
<input class="mt-3 mr-2 form-control" type="text" id="name" style="font-size:20px;" name="name"
value="{{ old('name') ?? $user->name }}" required>
</div>
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="mobile" ><h4>Telefonnummer:</h4></label>
<input type="text" class="mt-3 mr-2 form-control" id="mobile" style="font-size:20px;" name="mobile" value="{{ old('mobile') ?? $user->mobile }}" required >
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="mobile"><h4>Telefonnummer:</h4>
</label>
<input type="text" class="mt-3 mr-2 form-control" id="mobile" style="font-size:20px;" name="mobile"
value="{{ old('mobile') ?? $user->mobile }}" required>
</div>
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:150px; text-align:left;" for="name"><h4>EMail:</h4></label>
<input type="text" class="mt-3 mr-2 form-control" id="lastname" style="font-size:20px;" name="email" value="{{ old('email') ?? $user->email }}" required >
<input type="text" class="mt-3 mr-2 form-control" id="lastname" style="font-size:20px;" name="email"
value="{{ old('email') ?? $user->email }}" required>
</div>
@ -28,14 +33,17 @@
@if(file_exists (storage_path().'/img_storage/user/'.$user->id.'.jpg'))
<!--File exists -->
<a href="/img_storage/user/{{$user->id}}_gross.jpg" data-lightbox="{{$user->id}}_gross.jpg" data-title="{{ $user->name }}">
<img src="/img_storage/user/{{$user->id}}.jpg" id="bild" class="mt-3 ml-3" style="width:256px;height:256px">
<a href="/img_storage/user/{{$user->id}}_gross.jpg" data-lightbox="{{$user->id}}_gross.jpg"
data-title="{{ $user->name }}">
<img src="/img_storage/user/{{$user->id}}.jpg" id="bild" class="mt-3 ml-3"
style="width:256px;height:256px">
</a>
@else
<img src="/img/placeholder/user64x96.jpg" id="bild" class="mt-3 ml-3">
@endif
<input type="file" class="mt-3 mr-2 form-control" style="font-size:20px;" name="bild" value="" accept="image/*" onchange="preview_image(event)">
<input type="file" class="mt-3 mr-2 form-control" style="font-size:20px;" name="bild" value=""
accept="image/*" onchange="preview_image(event)">
</div>
@ -43,10 +51,18 @@
<div class="form-group" style="display:flex;">
<label class="ml-2 mt-4" style="width:130px; text-align:left;" for="name"><h4>Rolle:</h4></label>
<select name="role" class="dropdown-item ml-3 border form-control mt-3 mr-2" style="font-size:18px;" selected="{{ old('role') ?? $user->role }}">
<option value="GUEST" style="font-size:18px;" class="dropdown-item bg-light form-control" {{ $user->role=="GUEST" ? "selected" : "" }} >GUEST</option>
<option value="MEMBER" style="font-size:18px;" class="dropdown-item bg-light" {{ $user->role=="MEMBER" ? "selected" : "" }} >MEMBER</option>
<option value="ADMIN" style="font-size:18px;" class="dropdown-item bg-light" {{ $user->role=="ADMIN" ? "selected" : "" }} >ADMIN</option>
<select name="role" class="dropdown-item ml-3 border form-control mt-3 mr-2" style="font-size:18px;"
selected="{{ old('role') ?? $user->role }}">
<option value="GUEST" style="font-size:18px;"
class="dropdown-item bg-light form-control" {{ $user->role=="GUEST" ? "selected" : "" }} >
GUEST
</option>
<option value="MEMBER" style="font-size:18px;"
class="dropdown-item bg-light" {{ $user->role=="MEMBER" ? "selected" : "" }} >MEMBER
</option>
<option value="ADMIN" style="font-size:18px;"
class="dropdown-item bg-light" {{ $user->role=="ADMIN" ? "selected" : "" }} >ADMIN
</option>
</select>
</div>
@else
@ -56,11 +72,14 @@
</div>
@endif
<a href="/member" class="btn btn-primary col-2 mb-2 float-left" style="margin-right:20px;">Zurück</a>
@if(Auth::user()->role=="ADMIN" || Auth::user()->id==$user->id)
<button type="submit" class="btn btn-danger col-2 mb-2 float-right mr-2">Speichern</button>
<a href="/admin/destroy_user/{{$user->id}}" class="btn btn-primary col-2 mb-2 float-left"
style="margin-right:20px;">Löschen</a>
@endif
<a href="/member" class="btn btn-primary col-2 mb-2 float-left">Zurück</a>
</form>
@ -69,12 +88,10 @@
<!-------------------------------- ----------------------------->
<script>
function preview_image(event)
{
function preview_image(event) {
console.log("Preview triggered.")
var reader = new FileReader();
reader.onload = function()
{
reader.onload = function () {
console.log("onload")
var output = document.getElementById('bild');
console.log(output);

View file

@ -27,11 +27,16 @@ Route::get('/home', 'PageController@page_home')->name('home');
Route::post('/admin/store_home', 'AdminController@store_home')->middleware('auth');
Route::get('/activities', 'PageController@page_activities');
Route::get('/become_member', function () { return view('users.become_member'); });
Route::get('/meetings', function () { return view('meetings'); })->middleware('auth');
Route::get('/become_member', function () {
return view('users.become_member');
});
Route::get('/meetings', function () {
return view('meetings');
})->middleware('auth');
Route::resource('/member', UserController::class);
Route::get('/admin/destroy_user/{user_id}', 'UserController@destroy')->middleware('auth');
Route::get('/admin/upload_tourplan', 'AdminController@upload_tourplan')->middleware('auth');
Route::post('/admin/store_tourplan', 'AdminController@store_tourplan')->middleware('auth');
@ -49,15 +54,21 @@ Route::post('/tour/upload_gallery/{tour_id}', 'TourController@upload_gallery');
Route::resource('/tour', TourController::class)->middleware('auth');
Route::get('/tour/{tour_id}/join/{room_id}', 'TourController@join_room')->middleware('auth');
Route::get('/tour/{tour_id}/join4user/{room_id}/{user_id}', 'TourController@join_room4user')->middleware('auth');
Route::get('/tour/{tour_id}/cancelBooking', 'TourController@cancelBooking')->middleware('auth');
Route::get('/tour/{tour_id}/cancelBookingAdmin/{user_id}', 'TourController@cancelBookingAdmin')->middleware('auth');
Route::get('/tour/{tour_id}/create_room/{capacity}', 'TourController@create_room')->middleware('auth');
Route::get('/tour/{tour_id}/delete_room/{room_id}', 'TourController@delete_room')->middleware('auth');
Route::get('/tour/{tour_id}/assign_room_for_user/{user_id}', 'TourController@delete_room')->middleware('auth');
Route::get('/img_storage/{category}/{imageName}', 'ImageController@getImage'); // no middleware auth needed, its checked in Controller
Auth::routes();
/* Cache clearing on remote server */
Route::get('/clear-cache', function() { Artisan::call('cache:clear');Artisan::call('config:clear'); return "Cache cleared, Config reloaded"; });
Route::get('/clear-cache', function () {
Artisan::call('cache:clear');
Artisan::call('config:clear');
return "Cache cleared, Config reloaded";
});
//Route::get('/home', 'HomeController@index')->name('home');

4
motorradig/setenv.sh Normal file → Executable file
View file

@ -1,3 +1,3 @@
alias phpunit="docker-compose exec app vendor/bin/phpunit"
alias artisan="docker-compose exec app php artisan"
alias composer="docker-compose exec app composer"
alias artisan="sudo docker-compose exec app php artisan"
alias composer="sudo docker-compose exec app composer"

1
tools/dump_motorradig.py Normal file → Executable file
View file

@ -1,3 +1,4 @@
#!/usr/bin/python3
# This script needs mysqldump to be installed
# apt install mysql-client

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long