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,4 +1,37 @@
<?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::table('pages', function(Blueprint $table): void { $table->string('template')->default('default'); $table->timestamp('expires_at')->nullable(); $table->string('preview_token',64)->nullable()->unique(); $table->foreignId('locked_by')->nullable()->constrained('users')->nullOnDelete(); $table->timestamp('locked_at')->nullable(); }); Schema::create('page_revisions', function(Blueprint $table): void { $table->id(); $table->foreignId('page_id')->constrained('pages')->cascadeOnDelete(); $table->foreignId('user_id')->nullable()->constrained()->nullOnDelete(); $table->string('title'); $table->longText('content')->nullable(); $table->json('snapshot'); $table->timestamps(); }); } public function down(): void { Schema::dropIfExists('page_revisions'); Schema::table('pages', function(Blueprint $table): void { $table->dropConstrainedForeignId('locked_by'); $table->dropColumn(['template','expires_at','preview_token','locked_at']); }); } };
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('pages', function (Blueprint $table): void {
$table->string('template')->default('default');
$table->timestamp('expires_at')->nullable();
$table->string('preview_token', 64)->nullable()->unique();
$table->foreignId('locked_by')->nullable()->constrained('users')->nullOnDelete();
$table->timestamp('locked_at')->nullable();
});
Schema::create('page_revisions', function (Blueprint $table): void {
$table->id();
$table->foreignId('page_id')->constrained('pages')->cascadeOnDelete();
$table->foreignId('user_id')->nullable()->constrained()->nullOnDelete();
$table->string('title');
$table->longText('content')->nullable();
$table->json('snapshot');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('page_revisions');
Schema::table('pages', function (Blueprint $table): void {
$table->dropConstrainedForeignId('locked_by');
$table->dropColumn(['template', 'expires_at', 'preview_token', 'locked_at']);
});
}
};
@@ -10,22 +10,55 @@ use Modules\Pages\Models\Page;
final class PageController extends Controller
{
public function index(): View { return view('pages::admin.index', ['records' => Page::query()->latest()->paginate(20)]); }
public function create(): View { return view('pages::admin.form'); }
public function store(Request $request): RedirectResponse { $data = $request->validate(['title' => ['required', 'string', 'max:255'],
public function index(): View
{
return view('pages::admin.index', ['records' => Page::query()->latest()->paginate(20)]);
}
public function create(): View
{
return view('pages::admin.form');
}
public function store(Request $request): RedirectResponse
{
$data = $request->validate(['title' => ['required', 'string', 'max:255'],
'slug' => ['required', 'string', 'max:255'],
'summary' => ['nullable', 'string'],
'content' => ['nullable', 'string'],
'status' => ['required', 'string', 'max:255'],
'published_at' => ['nullable', 'date'],
'is_home' => ['sometimes', 'boolean']]); $data['is_home'] = $request->boolean('is_home'); Page::create($data); return redirect()->route('pages.index')->with('status', 'Page created.'); }
public function edit(Page $page): View { return view('pages::admin.form', ['record' => $page]); }
public function update(Request $request, Page $page): RedirectResponse { $data = $request->validate(['title' => ['required', 'string', 'max:255'],
'is_home' => ['sometimes', 'boolean']]);
$data['is_home'] = $request->boolean('is_home');
Page::create($data);
return redirect()->route('pages.index')->with('status', 'Page created.');
}
public function edit(Page $page): View
{
return view('pages::admin.form', ['record' => $page]);
}
public function update(Request $request, Page $page): RedirectResponse
{
$data = $request->validate(['title' => ['required', 'string', 'max:255'],
'slug' => ['required', 'string', 'max:255'],
'summary' => ['nullable', 'string'],
'content' => ['nullable', 'string'],
'status' => ['required', 'string', 'max:255'],
'published_at' => ['nullable', 'date'],
'is_home' => ['sometimes', 'boolean']]); $data['is_home'] = $request->boolean('is_home'); $page->update($data); return redirect()->route('pages.index')->with('status', 'Page updated.'); }
public function destroy(Page $page): RedirectResponse { $page->delete(); return back()->with('status', 'Page deleted.'); }
'is_home' => ['sometimes', 'boolean']]);
$data['is_home'] = $request->boolean('is_home');
$page->update($data);
return redirect()->route('pages.index')->with('status', 'Page updated.');
}
public function destroy(Page $page): RedirectResponse
{
$page->delete();
return back()->with('status', 'Page deleted.');
}
}
@@ -1,6 +1,17 @@
<?php
namespace Modules\Pages\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\View\View;
use Modules\Pages\Models\Page;
final class PublicPageController extends Controller { public function show(string $slug): View { $page=Page::query()->where('slug',$slug)->where('status','published')->where(fn($q)=>$q->whereNull('published_at')->orWhere('published_at','<=',now()))->firstOrFail(); return view('pages::public.show',compact('page')); } }
final class PublicPageController extends Controller
{
public function show(string $slug): View
{
$page = Page::query()->where('slug', $slug)->where('status', 'published')->where(fn ($q) => $q->whereNull('published_at')->orWhere('published_at', '<=', now()))->firstOrFail();
return view('pages::public.show', compact('page'));
}
}
+12 -8
View File
@@ -5,19 +5,23 @@ namespace Modules\Pages\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Modules\Workflow\Concerns\HasWorkflow;
use Modules\Localization\Concerns\HasTranslations;
use Modules\Sites\Concerns\BelongsToSites;
use Modules\Workflow\Concerns\HasWorkflow;
final class Page extends Model
{
use BelongsToSites, HasFactory, HasTranslations, HasWorkflow, SoftDeletes;
protected $table = 'pages';
protected $fillable = ['title', 'slug', 'summary', 'content', 'status', 'published_at', 'is_home'];
protected function casts(): array { return [
'published_at' => 'datetime',
'is_home' => 'boolean'
]; }
protected $table = 'pages';
protected $fillable = ['title', 'slug', 'summary', 'content', 'status', 'published_at', 'is_home'];
protected function casts(): array
{
return [
'published_at' => 'datetime',
'is_home' => 'boolean',
];
}
}
+2 -1
View File
@@ -2,9 +2,10 @@
use Illuminate\Support\Facades\Route;
use Modules\Pages\Http\Controllers\PageController;
use Modules\Pages\Http\Controllers\PublicPageController;
Route::middleware(['auth', 'verified'])->prefix('administration/pages')->name('administration.pages.')->group(function (): void {
Route::resource('/', PageController::class)->parameters(['' => 'page'])->except('show');
});
Route::get('/pages/{slug}', [Modules\Pages\Http\Controllers\PublicPageController::class, 'show'])->name('pages.public.show');
Route::get('/pages/{slug}', [PublicPageController::class, 'show'])->name('pages.public.show');
@@ -2,4 +2,6 @@
use Illuminate\Support\Facades\Route;
it('registers the Pages administration route', function (): void { expect(Route::has('administration.pages.index'))->toBeTrue(); });
it('registers the Pages administration route', function (): void {
expect(Route::has('administration.pages.index'))->toBeTrue();
});