Skip to content

Commit ad0598a

Browse files
authored
Merge pull request #65 from gander-oceanic-fir-vatsim/enhancement/finish-events
Merge current new events UX for 1.6.4
2 parents 177706d + 7b75b1f commit ad0598a

File tree

13 files changed

+415
-156
lines changed

13 files changed

+415
-156
lines changed

app/Http/Controllers/Events/EventController.php

+88
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
use Illuminate\Http\Request;
1111
use Auth;
1212
use Carbon\Carbon;
13+
use Illuminate\Support\Facades\Storage;
14+
use Illuminate\Support\Facades\Validator;
15+
use Illuminate\Support\Str;
1316

1417
class EventController extends Controller
1518
{
@@ -33,6 +36,11 @@ public function viewEvent($slug)
3336
{
3437
$event = Event::where('slug', $slug)->firstOrFail();
3538
$updates = $event->updates;
39+
if (Auth::check() && ControllerApplication::where('user_id', Auth::id())->where('event_id', $event->id))
40+
{
41+
$app = ControllerApplication::where('user_id', Auth::id())->where('event_id', $event->id)->first();
42+
return view('events.view', compact('event', 'updates', 'app'));
43+
}
3644
return view('events.view', compact('event', 'updates'));
3745
}
3846

@@ -71,4 +79,84 @@ public function adminViewEvent($slug)
7179
$updates = $event->updates;
7280
return view('admin.events.view', compact('event','applications', 'updates'));
7381
}
82+
83+
public function adminCreateEvent()
84+
{
85+
return view('admin.events.create');
86+
}
87+
88+
public function adminCreateEventPost(Request $request)
89+
{
90+
//Define validator messages
91+
$messages = [
92+
'name.required' => 'A name is required.',
93+
'name.max' => 'A name may not be more than 100 characters long.',
94+
'image.mimes' => 'An image file must be in the jpg png or gif formats.',
95+
'description.required' => 'A description is required.',
96+
];
97+
98+
//Validate
99+
$validator = Validator::make($request->all(), [
100+
'name' => 'required|max:100',
101+
'image' => 'mimes:jpeg,jpg,png,gif',
102+
'description' => 'required',
103+
'start' => 'required',
104+
'end' => 'required'
105+
], $messages);
106+
107+
//Redirect if fails
108+
if ($validator->fails()) {
109+
return redirect()->back()->withInput()->withErrors($validator, 'createEventErrors');
110+
}
111+
112+
//Create event object
113+
$event = new Event();
114+
115+
//Assign name
116+
$event->name = $request->get('name');
117+
118+
//Assign start/end date/time
119+
$event->start_timestamp = $request->get('start');
120+
$event->end_timestamp = $request->get('end');
121+
122+
//Assign description
123+
$event->description = $request->get('description');
124+
125+
//Assign user
126+
$event->user_id = Auth::id();
127+
128+
//Upload image if it exists
129+
if ($request->file('image')) {
130+
$basePath = 'public/files/'.Carbon::now()->toDateString().'/'.rand(1000,2000);
131+
$path = $request->file('image')->store($basePath);
132+
$event->image_url = Storage::url($path);
133+
}
134+
135+
//Create slug
136+
$event->slug = Str::slug($request->get('name').'-'.Carbon::now()->toDateString());
137+
138+
//Assign departure icao and arrival icao if they exist
139+
if ($request->get('departure_icao') && $request->get('arrival_icao')) {
140+
$event->departure_icao = $request->get('departure_icao');
141+
$event->arrival_icao = $request->get('arrival_icao');
142+
}
143+
144+
//If controller apps are open then lets make them open
145+
if ($request->has('openControllerApps')) {
146+
$event->controller_applications_open = true;
147+
}
148+
149+
//Save it
150+
$event->save();
151+
152+
//Redirect
153+
return redirect()->route('events.admin.view', $event->slug)->with('success', 'Event created!');
154+
}
155+
156+
public function adminDeleteEvent($slug)
157+
{
158+
$event = Event::where('slug', $slug)->firstOrFail();
159+
$event->delete();
160+
return redirect()->route('events.admin.index')->with('info', 'Event deleted.');
161+
}
74162
}

app/Http/Controllers/HomeController.php

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
namespace App\Http\Controllers;
44

5+
use App\Models\Events\Event;
56
use App\Models\News\News;
67
use App\Models\News\CarouselItem;
78
use App\Models\News\HomeNewControllerCert;
89
use Auth;
10+
use Carbon\Carbon;
911
use Illuminate\Http\Request;
1012
use Illuminate\Support\Facades\Cache;
1113
use Illuminate\Support\Facades\Log;
@@ -33,6 +35,9 @@ public function view()
3335
$certifications = HomeNewControllerCert::all()->sortByDesc('timestamp')->take(6);
3436
$carouselItems = CarouselItem::all();
3537

38+
//Event
39+
$nextEvent = Event::where('start_timestamp', '>', Carbon::now())->get()->sortByDesc('id')->first();
40+
3641
//Get VATCAN news
3742
$vatcanNews = Cache::remember('news.vatcan', 21600, function () {
3843
$url = 'http://www.vatcan.ca/ajax/news';
@@ -45,7 +50,7 @@ public function view()
4550
curl_close($ch);
4651
return json_decode($json);
4752
});
48-
return view('index', compact('ganderControllers', 'shanwickControllers', 'news', 'vatcanNews', 'certifications', 'carouselItems', 'planes'));
53+
return view('index', compact('ganderControllers', 'shanwickControllers', 'news', 'vatcanNews', 'certifications', 'carouselItems', 'planes', 'nextEvent'));
4954
}
5055

5156
public function map()

app/Models/Events/ControllerApplication.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function discord_webhook()
3838
/*
3939
* The image location for the senders image
4040
*/
41-
"avatar_url" => asset('img/iconwhitebg.png'),
41+
"avatar_url" => "https://resources.ganderoceanic.com/media/img/brand/sqr/ZQO_SQ_BLUE.png",
4242
/*
4343
* Whether or not to read the message in Text-to-speech
4444
*/
@@ -78,7 +78,7 @@ public function discord_webhook()
7878
// Footer object
7979
"footer" => [
8080
"text" => "Gander Oceanic Core",
81-
"icon_url" => asset('img/iconwhitebg.png')
81+
"icon_url" => "https://resources.ganderoceanic.com/media/img/brand/sqr/ZQO_SQ_BLUE.png"
8282
],
8383

8484
// Field array of objects

app/Models/Events/Event.php

+3
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99
use Illuminate\Support\HtmlString;
1010
use Auth;
1111
use Exception;
12+
use Illuminate\Database\Eloquent\SoftDeletes;
1213
use Illuminate\Support\Facades\Cache;
1314
use Illuminate\Support\Facades\Log;
1415

1516
class Event extends Model
1617
{
18+
use SoftDeletes;
19+
1720
protected $fillable = [
1821
'id', 'name', 'start_timestamp', 'end_timestamp', 'user_id', 'description', 'image_url', 'controller_applications_open', 'departure_icao', 'arrival_icao', 'slug'
1922
];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
class AddSoftDeletesToEvents extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*
12+
* @return void
13+
*/
14+
public function up()
15+
{
16+
Schema::table('events', function (Blueprint $table) {
17+
$table->softDeletes();
18+
});
19+
}
20+
21+
/**
22+
* Reverse the migrations.
23+
*
24+
* @return void
25+
*/
26+
public function down()
27+
{
28+
Schema::table('events', function (Blueprint $table) {
29+
$table->dropColumn('deleted_at');
30+
});
31+
}
32+
}

public/css/czqomd.css

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ body[data-theme="dark"] #czqoHeaderLight {
5252
background: rgb(47, 49, 54) !important;
5353
}
5454

55+
5556
body[data-theme="dark"] .modal-content {
5657
background: rgb(59, 61, 68) !important;
5758
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
@extends('layouts.master')
2+
@section('content')
3+
<div class="container py-4">
4+
<a href="{{route('events.admin.index')}}" class="blue-text" style="font-size: 1.2em;"> <i class="fas fa-arrow-left"></i> Events</a>
5+
<h1 class="font-weight-bold blue-text">Create Event</h1>
6+
<hr>
7+
@csrf
8+
<div class="row">
9+
<div class="col-md-12">
10+
<form method="POST" action="{{route('events.admin.create.post')}}" enctype="multipart/form-data">
11+
@csrf
12+
@if($errors->createEventErrors->any())
13+
<div class="alert alert-danger">
14+
<h4>There were errors creating the event</h4>
15+
<ul class="pl-0 ml-0 list-unstyled">
16+
@foreach ($errors->createEventErrors->all() as $error)
17+
<li>{{ $error }}</li>
18+
@endforeach
19+
</ul>
20+
</div>
21+
@endif
22+
<ul class="stepper mt-0 p-0 stepper-vertical">
23+
<li class="active">
24+
<a href="#!">
25+
<span class="circle">1</span>
26+
<span class="label">Primary information</span>
27+
</a>
28+
<div class="step-content w-75 pt-0">
29+
<div class="form-group">
30+
<label for="">Event name</label>
31+
<input type="text" name="name" id="" class="form-control" placeholder="Staff Up Saturdays">
32+
</div>
33+
<div class="form-group">
34+
<label for="">Start date and time</label>
35+
<input type="datetime" name="start" placeholder="Put event start date/time here" class="form-control flatpickr" id="event_start">
36+
</div>
37+
<div class="form-group">
38+
<label for="">End date and time</label>
39+
<input type="datetime" name="end" placeholder="Put event end date/time here" class="form-control flatpickr" id="event_end">
40+
</div>
41+
<div class="form-group">
42+
<label for="">Departure airport ICAO (optional)</label>
43+
<input maxlength="4" type="text" name="departure_icao" id="" class="form-control" placeholder="CYYC">
44+
</div>
45+
<div class="form-group">
46+
<label for="">Arrival airport ICAO (optional)</label>
47+
<input maxlength="4" type="text" name="arrival_icao" id="" class="form-control" placeholder="EIDW">
48+
</div>
49+
<script>
50+
flatpickr('#event_start', {
51+
enableTime: true,
52+
noCalendar: false,
53+
dateFormat: "Y-m-d H:i",
54+
time_24hr: true,
55+
});
56+
flatpickr('#event_end', {
57+
enableTime: true,
58+
noCalendar: false,
59+
dateFormat: "Y-m-d H:i",
60+
time_24hr: true,
61+
});
62+
</script>
63+
</div>
64+
</li>
65+
<li class="active">
66+
<a href="#!">
67+
<span class="circle">2</span>
68+
<span class="label">Description</span>
69+
</a>
70+
<div class="step-content w-75 pt-0">
71+
<div class="form-group">
72+
<label for="">Use Markdown</label>
73+
<textarea id="contentMD" name="description" class="w-75"></textarea>
74+
<script>
75+
var simplemde = new SimpleMDE({ element: document.getElementById("contentMD"), toolbar: false });
76+
</script>
77+
</div>
78+
</div>
79+
</li>
80+
<li class="active">
81+
<a href="#!">
82+
<span class="circle">3</span>
83+
<span class="label">Image</span>
84+
</a>
85+
<div class="step-content w-75 pt-0">
86+
<p>An image can be displayed for the event. Please ensure we have the right to use the image, and that it is of an acceptable resolution. Make sure the image has no text or logos on it.</p>
87+
<div class="input-group pb-3">
88+
<div class="custom-file">
89+
<input type="file" class="custom-file-input" name="image">
90+
<label class="custom-file-label">Choose image</label>
91+
</div>
92+
</div>
93+
</div>
94+
</li>
95+
<li class="active">
96+
<a href="#!">
97+
<span class="circle">4</span>
98+
<span class="label">Options</span>
99+
</a>
100+
<div class="step-content w-75 pt-0">
101+
<div class="form-group">
102+
<div class="mr-2">
103+
<input type="checkbox" class="" name="openControllerApps" id="openControllerApps">
104+
<label class="" for="">Open controller applications</label>
105+
</div>
106+
</div>
107+
</div>
108+
</li>
109+
</ul>
110+
<input type="submit" value="Create Event" class="btn btn-primary">
111+
</form>
112+
</div>
113+
</div>
114+
</div>
115+
@endsection

resources/views/admin/events/index.blade.php

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
@extends('layouts.master')
22
@section('content')
33
<div class="container py-4">
4-
<h2>Events</h2>
4+
<a href="{{route('dashboard.index')}}" class="blue-text" style="font-size: 1.2em;"> <i class="fas fa-arrow-left"></i> Dashboard</a>
5+
<h1 class="font-weight-bold blue-text">Events</h1>
56
<hr>
67
<div class="row">
78
<div class="col-md-6">
8-
<a href="#" class="mb-3 btn btn-block btn-md waves-effect btn-primary">Create Event</a>
9+
<a href="{{route('events.admin.create')}}" class="mb-3 btn btn-block btn-md waves-effect btn-primary">Create Event</a>
910
<table class="table dt table-hover table-bordered">
1011
<thead>
1112
<th>Title</th>
1213
<th>Date</th>
1314
</thead>
1415
<tbody>
1516
@foreach ($events as $e)
16-
<td>
17-
<a href="{{route('events.admin.view', $e->slug)}}" class="blue-text">{{$e->name}}</a>
18-
</td>
19-
<td>
20-
{{$e->start_timestamp_pretty()}}
21-
</td>
17+
<tr>
18+
<td>
19+
<a href="{{route('events.admin.view', $e->slug)}}" class="blue-text">{{$e->name}}</a>
20+
</td>
21+
<td>
22+
{{$e->start_timestamp_pretty()}}
23+
</td>
24+
</tr>
2225
@endforeach
2326
</tbody>
2427
</table>

0 commit comments

Comments
 (0)