style updates

This commit is contained in:
Mark Gregory
2026-07-24 14:59:44 +01:00
parent 24ab771cd3
commit dd23205d0b
482 changed files with 7173 additions and 1435 deletions
+1
View File
@@ -1,2 +1,3 @@
<?php
return ['name' => 'Events'];
@@ -1,3 +1,51 @@
<?php
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;
return new class extends Migration { public function up(): void { Schema::create('event_venues',function(Blueprint $t): void{$t->id();$t->string('name');$t->text('address')->nullable();$t->unsignedInteger('capacity')->nullable();$t->timestamps();}); Schema::create('events',function(Blueprint $t): void{$t->id();$t->foreignId('venue_id')->nullable()->constrained('event_venues')->nullOnDelete();$t->string('title');$t->string('slug')->unique();$t->text('summary')->nullable();$t->longText('description')->nullable();$t->timestamp('starts_at')->index();$t->timestamp('ends_at')->nullable();$t->string('status')->default('draft')->index();$t->unsignedInteger('capacity')->nullable();$t->decimal('price',10,2)->default(0);$t->boolean('registration_open')->default(false);$t->timestamps();}); Schema::create('event_registrations',function(Blueprint $t): void{$t->id();$t->foreignId('event_id')->constrained()->cascadeOnDelete();$t->string('name');$t->string('email')->index();$t->unsignedInteger('quantity')->default(1);$t->string('status')->default('confirmed')->index();$t->text('notes')->nullable();$t->timestamps();}); } public function down(): void { Schema::dropIfExists('event_registrations');Schema::dropIfExists('events');Schema::dropIfExists('event_venues'); } };
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('event_venues', function (Blueprint $t): void {
$t->id();
$t->string('name');
$t->text('address')->nullable();
$t->unsignedInteger('capacity')->nullable();
$t->timestamps();
});
Schema::create('events', function (Blueprint $t): void {
$t->id();
$t->foreignId('venue_id')->nullable()->constrained('event_venues')->nullOnDelete();
$t->string('title');
$t->string('slug')->unique();
$t->text('summary')->nullable();
$t->longText('description')->nullable();
$t->timestamp('starts_at')->index();
$t->timestamp('ends_at')->nullable();
$t->string('status')->default('draft')->index();
$t->unsignedInteger('capacity')->nullable();
$t->decimal('price', 10, 2)->default(0);
$t->boolean('registration_open')->default(false);
$t->timestamps();
});
Schema::create('event_registrations', function (Blueprint $t): void {
$t->id();
$t->foreignId('event_id')->constrained()->cascadeOnDelete();
$t->string('name');
$t->string('email')->index();
$t->unsignedInteger('quantity')->default(1);
$t->string('status')->default('confirmed')->index();
$t->text('notes')->nullable();
$t->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('event_registrations');
Schema::dropIfExists('events');
Schema::dropIfExists('event_venues');
}
};
@@ -1,3 +1,32 @@
<?php
namespace Modules\Events\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; use Modules\Events\Models\Event; use Modules\Events\Models\Venue;
final class EventController extends Controller { public function index(): View { return view('events::admin.index',['events'=>Event::with(['venue'])->withCount('registrations')->orderBy('starts_at')->paginate(20),'venues'=>Venue::orderBy('name')->get()]); } public function store(Request $r): RedirectResponse { Event::create($r->validate(['venue_id'=>['nullable','exists:event_venues,id'],'title'=>['required','string','max:255'],'slug'=>['required','string','max:255','unique:events,slug'],'summary'=>['nullable','string'],'description'=>['nullable','string'],'starts_at'=>['required','date'],'ends_at'=>['nullable','date','after:starts_at'],'status'=>['required','in:draft,published,cancelled,completed'],'capacity'=>['nullable','integer','min:1'],'price'=>['required','numeric','min:0']])+['registration_open'=>$r->boolean('registration_open')]); return back()->with('status','Event created.'); } public function destroy(Event $event): RedirectResponse { $event->delete(); return back()->with('status','Event deleted.'); } }
namespace Modules\Events\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Modules\Events\Models\Event;
use Modules\Events\Models\Venue;
final class EventController extends Controller
{
public function index(): View
{
return view('events::admin.index', ['events' => Event::with(['venue'])->withCount('registrations')->orderBy('starts_at')->paginate(20), 'venues' => Venue::orderBy('name')->get()]);
}
public function store(Request $r): RedirectResponse
{
Event::create($r->validate(['venue_id' => ['nullable', 'exists:event_venues,id'], 'title' => ['required', 'string', 'max:255'], 'slug' => ['required', 'string', 'max:255', 'unique:events,slug'], 'summary' => ['nullable', 'string'], 'description' => ['nullable', 'string'], 'starts_at' => ['required', 'date'], 'ends_at' => ['nullable', 'date', 'after:starts_at'], 'status' => ['required', 'in:draft,published,cancelled,completed'], 'capacity' => ['nullable', 'integer', 'min:1'], 'price' => ['required', 'numeric', 'min:0']]) + ['registration_open' => $r->boolean('registration_open')]);
return back()->with('status', 'Event created.');
}
public function destroy(Event $event): RedirectResponse
{
$event->delete();
return back()->with('status', 'Event deleted.');
}
}
+26 -2
View File
@@ -1,3 +1,27 @@
<?php
namespace Modules\Events\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany;
final class Event extends Model { protected $fillable=['venue_id','title','slug','summary','description','starts_at','ends_at','status','capacity','price','registration_open']; protected function casts(): array { return ['starts_at'=>'datetime','ends_at'=>'datetime','price'=>'decimal:2','registration_open'=>'boolean']; } public function venue(): BelongsTo { return $this->belongsTo(Venue::class); } public function registrations(): HasMany { return $this->hasMany(Registration::class); } }
namespace Modules\Events\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
final class Event extends Model
{
protected $fillable = ['venue_id', 'title', 'slug', 'summary', 'description', 'starts_at', 'ends_at', 'status', 'capacity', 'price', 'registration_open'];
protected function casts(): array
{
return ['starts_at' => 'datetime', 'ends_at' => 'datetime', 'price' => 'decimal:2', 'registration_open' => 'boolean'];
}
public function venue(): BelongsTo
{
return $this->belongsTo(Venue::class);
}
public function registrations(): HasMany
{
return $this->hasMany(Registration::class);
}
}
+11 -2
View File
@@ -1,3 +1,12 @@
<?php
namespace Modules\Events\Models; use Illuminate\Database\Eloquent\Model;
final class Registration extends Model { protected $table='event_registrations'; protected $fillable=['event_id','name','email','quantity','status','notes']; }
namespace Modules\Events\Models;
use Illuminate\Database\Eloquent\Model;
final class Registration extends Model
{
protected $table = 'event_registrations';
protected $fillable = ['event_id', 'name', 'email', 'quantity', 'status', 'notes'];
}
+11 -2
View File
@@ -1,3 +1,12 @@
<?php
namespace Modules\Events\Models; use Illuminate\Database\Eloquent\Model;
final class Venue extends Model { protected $table='event_venues'; protected $fillable=['name','address','capacity']; }
namespace Modules\Events\Models;
use Illuminate\Database\Eloquent\Model;
final class Venue extends Model
{
protected $table = 'event_venues';
protected $fillable = ['name', 'address', 'capacity'];
}
@@ -1,6 +1,9 @@
<?php
namespace Modules\Events\Providers;
use Illuminate\Support\ServiceProvider;
final class EventsServiceProvider extends ServiceProvider
{
public function register(): void
@@ -8,6 +11,7 @@ final class EventsServiceProvider extends ServiceProvider
$this->app->register(RouteServiceProvider::class);
$this->mergeConfigFrom(module_path('Events', 'Config/config.php'), 'events');
}
public function boot(): void
{
$this->loadMigrationsFrom(module_path('Events', 'Database/Migrations'));
@@ -1,7 +1,10 @@
<?php
namespace Modules\Events\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
final class RouteServiceProvider extends ServiceProvider
{
public function boot(): void
+9 -2
View File
@@ -1,3 +1,10 @@
<?php
use Illuminate\Support\Facades\Route; use Modules\Events\Http\Controllers\EventController;
Route::middleware(['auth','verified'])->prefix('administration/events')->name('administration.events.')->group(function(): void { Route::get('/',[EventController::class,'index'])->name('index'); Route::post('/',[EventController::class,'store'])->name('store'); Route::delete('/{event}',[EventController::class,'destroy'])->name('destroy'); });
use Illuminate\Support\Facades\Route;
use Modules\Events\Http\Controllers\EventController;
Route::middleware(['auth', 'verified'])->prefix('administration/events')->name('administration.events.')->group(function (): void {
Route::get('/', [EventController::class, 'index'])->name('index');
Route::post('/', [EventController::class, 'store'])->name('store');
Route::delete('/{event}', [EventController::class, 'destroy'])->name('destroy');
});
@@ -1,6 +1,9 @@
<?php
namespace Modules\Events\Tests\Feature;
use Tests\TestCase;
final class ModuleBootTest extends TestCase
{
public function test_module_configuration_is_available(): void