Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions app/Filament/Resources/StaticPages/Pages/EditStaticPage.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace App\Filament\Resources\StaticPages\Pages;

use App\Filament\Resources\StaticPages\StaticPageResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;

class EditStaticPage extends EditRecord
Expand All @@ -12,8 +11,6 @@ class EditStaticPage extends EditRecord

protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
return [];
}
}
5 changes: 1 addition & 4 deletions app/Filament/Resources/StaticPages/Pages/ListStaticPages.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace App\Filament\Resources\StaticPages\Pages;

use App\Filament\Resources\StaticPages\StaticPageResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;

class ListStaticPages extends ListRecords
Expand All @@ -12,8 +11,6 @@ class ListStaticPages extends ListRecords

protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
return [];
}
}
16 changes: 12 additions & 4 deletions app/Filament/Resources/StaticPages/Schemas/StaticPageForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,25 @@ public static function configure(Schema $schema): Schema
return $schema
->components([
TextInput::make('slug')
->required()
->unique(ignoreRecord: true),
->disabled()
->dehydrated(false),
Tabs::make('Translations')
->tabs([
Tab::make('Română')->schema([
TextInput::make('title_ro')->required(),
RichEditor::make('body_ro')->required(),
RichEditor::make('body_ro')
->required()
->fileAttachmentsDisk('public')
->fileAttachmentsDirectory('static-pages')
->helperText(__('admin.resources.static_pages.blocks_hint')),
]),
Tab::make('English')->schema([
TextInput::make('title_en')->required(),
RichEditor::make('body_en')->required(),
RichEditor::make('body_en')
->required()
->fileAttachmentsDisk('public')
->fileAttachmentsDirectory('static-pages')
->helperText(__('admin.resources.static_pages.blocks_hint')),
]),
])
->columnSpanFull(),
Expand Down
8 changes: 6 additions & 2 deletions app/Filament/Resources/StaticPages/StaticPageResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace App\Filament\Resources\StaticPages;

use App\Filament\Concerns\HasTranslatedLabels;
use App\Filament\Resources\StaticPages\Pages\CreateStaticPage;
use App\Filament\Resources\StaticPages\Pages\EditStaticPage;
use App\Filament\Resources\StaticPages\Pages\ListStaticPages;
use App\Filament\Resources\StaticPages\Schemas\StaticPageForm;
Expand All @@ -14,6 +13,7 @@
use Filament\Schemas\Schema;
use Filament\Support\Icons\Heroicon;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use UnitEnum;

class StaticPageResource extends Resource
Expand All @@ -26,6 +26,11 @@ class StaticPageResource extends Resource

protected static string|UnitEnum|null $navigationGroup = 'Content';

public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()->whereIn('slug', StaticPage::MANAGED_SLUGS);
}

public static function form(Schema $schema): Schema
{
return StaticPageForm::configure($schema);
Expand All @@ -47,7 +52,6 @@ public static function getPages(): array
{
return [
'index' => ListStaticPages::route('/'),
'create' => CreateStaticPage::route('/create'),
'edit' => EditStaticPage::route('/{record}/edit'),
];
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

namespace App\Filament\Resources\StaticPages\Tables;

use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
Expand Down Expand Up @@ -37,11 +35,6 @@ public static function configure(Table $table): Table
])
->recordActions([
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
}
16 changes: 15 additions & 1 deletion app/Models/StaticPage.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,22 @@
])]
class StaticPage extends Model
{
/**
* Pages an administrator may edit. New pages cannot be added.
*
* @var list<string>
*/
public const MANAGED_SLUGS = [
'terms',
'privacy',
'home',
'about',
'contact',
];

/** @use HasFactory<StaticPageFactory> */
use HasFactory;

use HasTranslations;

protected function casts(): array
Expand All @@ -31,7 +45,7 @@ protected function casts(): array
}

/**
* @param Builder<StaticPage> $query
* @param Builder<StaticPage> $query
* @return Builder<StaticPage>
*/
public function scopePublished(Builder $query): Builder
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

use Database\Seeders\StaticPageSeeder;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
(new StaticPageSeeder)->run();

DB::table('static_pages')
->whereNotIn('slug', ['terms', 'privacy', 'home', 'about', 'contact'])
->delete();
}

/**
* Reverse the migrations.
*/
public function down(): void
{
//
}
};
28 changes: 21 additions & 7 deletions database/seeders/StaticPageSeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,27 @@ class StaticPageSeeder extends Seeder
public function run(): void
{
$pages = [
[
'slug' => 'home',
'title_ro' => __('home.hero_title', [], 'ro'),
'title_en' => __('home.hero_title', [], 'en'),
'body_ro' => __('home.hero_subtitle', [], 'ro'),
'body_en' => __('home.hero_subtitle', [], 'en'),
],
[
'slug' => 'about',
'title_ro' => __('about.title', [], 'ro'),
'title_en' => __('about.title', [], 'en'),
'body_ro' => __('about.mission_body', [], 'ro'),
'body_en' => __('about.mission_body', [], 'en'),
],
[
'slug' => 'contact',
'title_ro' => __('contact.title', [], 'ro'),
'title_en' => __('contact.title', [], 'en'),
'body_ro' => __('contact.subtitle', [], 'ro'),
'body_en' => __('contact.subtitle', [], 'en'),
],
[
'slug' => 'terms',
'title_ro' => 'Termeni și condiții',
Expand All @@ -27,13 +48,6 @@ public function run(): void
'body_ro' => 'Protejăm datele personale conform legislației aplicabile și colectăm numai informațiile necesare funcționării platformei. Nu trebuie încărcate date cu caracter personal despre victime sau copii aflați în situații de risc. Pentru solicitări privind datele personale, contactați administratorul platformei.',
'body_en' => 'We protect personal data under applicable law and collect only information needed to operate the platform. Personally identifiable information about victims or children at risk must not be uploaded. Contact the platform administrator for privacy requests.',
],
[
'slug' => 'accessibility',
'title_ro' => 'Declarație de accesibilitate',
'title_en' => 'Accessibility Statement',
'body_ro' => 'Ne propunem ca platforma să fie utilizabilă de cât mai multe persoane, inclusiv de utilizatorii tehnologiilor asistive. Lucrăm continuu la navigarea cu tastatura, contrast, structură semantică și alternative text. Ne puteți semnala orice barieră de accesibilitate.',
'body_en' => 'We aim to make the platform usable by as many people as possible, including assistive-technology users. We continuously improve keyboard navigation, contrast, semantic structure, and text alternatives. Please report any accessibility barrier you encounter.',
],
];

foreach ($pages as $page) {
Expand Down
1 change: 1 addition & 0 deletions lang/en/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
'navigation' => 'Static Pages',
'label' => 'Static Page',
'plural' => 'Static Pages',
'blocks_hint' => 'You can edit the text and images in the existing content. Maximum image size: 5 MB.',
],
'statistic_datasets' => [
'navigation' => 'Statistic Datasets',
Expand Down
1 change: 1 addition & 0 deletions lang/ro/admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
'navigation' => 'Pagini statice',
'label' => 'Pagină statică',
'plural' => 'Pagini statice',
'blocks_hint' => 'Poți edita textul și imaginile din conținutul existent. Dimensiunea maximă a unei imagini: 5 MB.',
],
'statistic_datasets' => [
'navigation' => 'Seturi statistice',
Expand Down
13 changes: 10 additions & 3 deletions resources/views/pages/⚡about.blade.php
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
<?php

use App\Models\StaticPage;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;

new #[Layout('layouts.app')] #[Title('About')] class extends Component {};
new #[Layout('layouts.app')] #[Title('About')] class extends Component
{
public function pageCopy(): ?StaticPage
{
return StaticPage::query()->published()->where('slug', 'about')->first();
}
};
?>

<div class="min-h-screen bg-background">
<x-page-header :title="__('about.title')" :subtitle="__('about.subtitle')" />
<x-page-header :title="$this->pageCopy()?->title ?: __('about.title')" :subtitle="__('about.subtitle')" />

<main class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12 space-y-8">
<x-ui.card class="p-8">
<h2 class="text-2xl font-bold text-navy mb-4">{{ __('about.mission_title') }}</h2>
<p class="text-navy leading-7">{{ __('about.mission_body') }}</p>
<div class="text-navy leading-7">{!! $this->pageCopy()?->body ?: e(__('about.mission_body')) !!}</div>
</x-ui.card>

<section>
Expand Down
11 changes: 10 additions & 1 deletion resources/views/pages/⚡contact.blade.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?php

use App\Models\StaticPage;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
use Livewire\Component;
Expand All @@ -9,6 +10,11 @@
/**
* @return list<string>
*/
public function pageCopy(): ?StaticPage
{
return StaticPage::query()->published()->where('slug', 'contact')->first();
}

public function organizationKeys(): array
{
return ['anitp', 'fonpc', 'eliberare', 'tdh', 'world_vision', 'code'];
Expand All @@ -17,7 +23,10 @@ public function organizationKeys(): array
?>

<div class="min-h-screen bg-background">
<x-page-header :title="__('contact.title')" :subtitle="__('contact.subtitle')" />
<x-page-header
:title="$this->pageCopy()?->title ?: __('contact.title')"
:subtitle="trim(strip_tags((string) ($this->pageCopy()?->body ?: __('contact.subtitle'))))"
/>

<main class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12 space-y-6">
@foreach ($this->organizationKeys() as $key)
Expand Down
10 changes: 8 additions & 2 deletions resources/views/pages/⚡home.blade.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use App\Models\Resource;
use App\Models\StaticPage;
use Illuminate\Database\Eloquent\Collection;
use Livewire\Attributes\Layout;
use Livewire\Attributes\Title;
Expand All @@ -16,6 +17,11 @@

public int $statRecovered = 89;

public function pageCopy(): ?StaticPage
{
return StaticPage::query()->published()->where('slug', 'home')->first();
}

/** @return Collection<int, Resource> */
public function featuredResources(): Collection
{
Expand All @@ -36,9 +42,9 @@ public function featuredResources(): Collection
<svg class="w-12 h-12 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
</svg>
<h1 class="text-4xl md:text-5xl font-bold">{{ __('home.hero_title') }}</h1>
<h1 class="text-4xl md:text-5xl font-bold">{{ $this->pageCopy()?->title ?: __('home.hero_title') }}</h1>
</div>
<p class="text-xl md:text-2xl mb-8 text-white">{{ __('home.hero_subtitle') }}</p>
<div class="text-xl md:text-2xl mb-8 text-white">{!! $this->pageCopy()?->body ?: e(__('home.hero_subtitle')) !!}</div>
<div class="flex flex-wrap gap-4">
<x-ui.button href="{{ localized_route('resources.index') }}" variant="secondary" class="!text-navy">{{ __('home.explore') }}</x-ui.button>
<x-ui.button href="{{ localized_route('about') }}" variant="accent">{{ __('home.learn_more') }}</x-ui.button>
Expand Down
27 changes: 27 additions & 0 deletions tests/Feature/StaticPagesAdminTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

use App\Filament\Resources\StaticPages\Pages\EditStaticPage;
use App\Filament\Resources\StaticPages\Pages\ListStaticPages;
use App\Models\StaticPage;
use App\Models\User;
use Livewire\Livewire;

test('static pages are limited to the managed set and cannot be created or deleted', function () {
$this->actingAs(User::factory()->admin()->create());

expect(StaticPage::query()->pluck('slug')->sort()->values()->all())
->toBe(['about', 'contact', 'home', 'privacy', 'terms']);

Livewire::test(ListStaticPages::class)
->assertSee('terms')
->assertSee('privacy')
->assertSee('home')
->assertSee('about')
->assertSee('contact')
->assertDontSee('accessibility')
->assertDontSee('Create');

Livewire::test(EditStaticPage::class, ['record' => 'about'])
->assertSee('You can edit the text and images in the existing content. Maximum image size: 5 MB.', false)
->assertSee('wire:name="App\\Filament\\Resources\\StaticPages\\Pages\\EditStaticPage"', false);
});
Loading