Skip to content
Closed
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
20 changes: 20 additions & 0 deletions database/factories/WorldCountryFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Eclipse\Core\Database\Factories;

use Eclipse\Core\Models\WorldCountry;
use Illuminate\Database\Eloquent\Factories\Factory;

class WorldCountryFactory extends Factory
{
protected $model = WorldCountry::class;

public function definition(): array
{
return [
'name' => $this->faker->country,
'code' => $this->faker->unique()->countryCode,
'region_id' => null, // Will be set manually or in test
];
}
}
26 changes: 26 additions & 0 deletions database/factories/WorldRegionFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace Eclipse\Core\Database\Factories;

use Eclipse\Core\Models\WorldRegion;
use Illuminate\Database\Eloquent\Factories\Factory;

class WorldRegionFactory extends Factory
{
protected $model = WorldRegion::class;

public function definition(): array
{
return [
'name' => $this->faker->unique()->country,
'code' => $this->faker->unique()->countryCode,
'parent_id' => null,
'is_special' => false,
];
}

public function special(): self
{
return $this->state(fn () => ['is_special' => true]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?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('world_countries', function (Blueprint $table) {
$table->id();
$table->string('code')->nullable();
$table->foreignId('region_id')->nullable()->constrained('world_regions')->nullOnDelete();
$table->timestamps();
});
}

public function down(): void
{
Schema::dropIfExists('world_countries');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?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('world_countries', function (Blueprint $table) {
// $table->id();
$table->string('code')->nullable();
$table->foreignId('region_id')->nullable()->constrained('world_regions')->nullOnDelete();
// $table->timestamps();
});
}

public function down(): void
{
Schema::dropIfExists('world_countries');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
public function up()
{
Schema::create('world_country_in_special_region', function (Blueprint $table) {
$table->id();
$table->foreignId('country_id')->constrained('world_countries')->cascadeOnDelete();
$table->foreignId('region_id')->constrained('world_regions')->cascadeOnDelete();
$table->date('start_date')->default(DB::raw('CURRENT_DATE'));
$table->date('end_date')->nullable();
$table->timestamps();
});
}

public function down()
{
Schema::dropIfExists('world_country_in_special_region');
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
public function up()
{
Schema::create('world_regions', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('code')->nullable()->unique();
$table->foreignId('parent_id')->nullable()->constrained('world_regions')->nullOnDelete();
$table->boolean('is_special')->default(false);
$table->softDeletes(); // For soft delete functionality
$table->timestamps();
});
}

public function down()
{
Schema::dropIfExists('world_regions');
}
};
32 changes: 32 additions & 0 deletions database/seeders/SeedEURegionSeeder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Eclipse\Core\Models\WorldRegion;
use Eclipse\Core\Models\WorldCountry;

class SeedEURegionSeeder extends Seeder
{
public function run(): void
{
$eu = WorldRegion::firstOrCreate(
['code' => 'EU'],
['name' => 'European Union', 'is_special' => true]
);

$euCountryCodes = [
'FR', 'DE', 'IT', 'ES', 'NL', 'BE', 'PL', 'SE', 'AT', 'FI', 'DK',
'IE', 'PT', 'CZ', 'SK', 'HU', 'RO', 'BG', 'HR', 'GR', 'SI',
'LT', 'LV', 'EE', 'CY', 'LU', 'MT'
];

$countries = WorldCountry::whereIn('code', $euCountryCodes)->get();

foreach ($countries as $country) {
$country->specialRegions()->syncWithoutDetaching([
$eu->id => ['start_date' => now()]
]);
}
}
}
Binary file added database/testing.sqlite
Binary file not shown.
Binary file added database/testing.sqlite-journal
Binary file not shown.
31 changes: 31 additions & 0 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,34 @@
<server name="TELESCOPE_ENABLED" value="false"/>
</php>
</phpunit>

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
>
<testsuites>
<testsuite name="Test Suite">
<directory>./tests</directory>
</testsuite>
</testsuites>
<source>
<include>
<directory>./src</directory>
</include>
</source>
<php>
<server name="APP_ENV" value="testing"/>
<server name="APP_KEY" value="base64:QIj9Xow3vowLrZ9DpsziH6figQTF/Zyoz9ssW8M7DIs="/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value="database/testing.sqlite"/>
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
<server name="TELESCOPE_STORAGE_DATABASE_CONNECTION" value="sqlite"/>
</php>
</phpunit>
11 changes: 11 additions & 0 deletions src/Filament/Pages/CreateCountry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Eclipse\Core\Filament\Pages;

use Eclipse\Core\Filament\Resources\CountryResource;
use Filament\Resources\Pages\CreateRecord;

class CreateCountry extends CreateRecord
{
protected static string $resource = CountryResource::class;
}
10 changes: 10 additions & 0 deletions src/Filament/Pages/CreateWorldRegion.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php
namespace Eclipse\Core\Filament\Pages;

use Eclipse\Core\Filament\Resources\WorldRegionResource;
use Filament\Resources\Pages\CreateRecord;

class CreateWorldRegion extends CreateRecord
{
protected static string $resource = WorldRegionResource::class;
}
11 changes: 11 additions & 0 deletions src/Filament/Pages/EditCountry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Eclipse\Core\Filament\Pages;

use Eclipse\Core\Filament\Resources\CountryResource;
use Filament\Resources\Pages\EditRecord;

class EditCountry extends EditRecord
{
protected static string $resource = CountryResource::class;
}
10 changes: 10 additions & 0 deletions src/Filament/Pages/EditWorldRegion.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php
namespace Eclipse\Core\Filament\Pages;

use Eclipse\Core\Filament\Resources\WorldRegionResource;
use Filament\Resources\Pages\EditRecord;

class EditWorldRegion extends EditRecord
{
protected static string $resource = WorldRegionResource::class;
}
11 changes: 11 additions & 0 deletions src/Filament/Pages/ListCountries.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Eclipse\Core\Filament\Pages;

use Eclipse\Core\Filament\Resources\CountryResource;
use Filament\Resources\Pages\ListRecords;

class ListCountries extends ListRecords
{
protected static string $resource = CountryResource::class;
}
11 changes: 11 additions & 0 deletions src/Filament/Pages/ListWorldRegions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace Eclipse\Core\Filament\Pages;

use Eclipse\Core\Filament\Resources\WorldRegionResource;
use Filament\Resources\Pages\ListRecords;

class ListWorldRegions extends ListRecords
{
protected static string $resource = WorldRegionResource::class;
}
95 changes: 95 additions & 0 deletions src/Filament/Resources/CountryResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php

namespace Eclipse\Core\Filament\Resources;

use Eclipse\Core\Filament\Pages\CreateCountry;
use Eclipse\Core\Filament\Pages\EditCountry;
use Eclipse\Core\Filament\Pages\ListCountries;
use Eclipse\Core\Models\WorldCountry;
use Filament\Forms;
use Filament\Tables;
use Filament\Resources\Resource;
use Filament\Forms\Form;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Filament\Tables\Filters\SelectFilter;
use BezhanSalleh\FilamentShield\Contracts\HasShieldPermissions;

class CountryResource extends Resource implements HasShieldPermissions
{
protected static ?string $model = WorldCountry::class;

protected static ?string $navigationIcon = 'heroicon-o-flag';
protected static ?string $navigationGroup = 'World';

protected static ?string $slug = 'countries';

public static function getPermissionPrefixes(): array
{
return ['view', 'view_any', 'create', 'update', 'delete', 'delete_any'];
}

public static function form(Form $form): Form
{
return $form->schema([
Forms\Components\TextInput::make('name')
->required()
->maxLength(255),
Forms\Components\TextInput::make('code')
->required()
->maxLength(10),
Forms\Components\Select::make('region_id')
->relationship('geoRegion', 'name')
->label('Geo Region')
->searchable()
->nullable(),
Forms\Components\Select::make('specialRegions')
->multiple()
->relationship('specialRegions', 'name')
->label('Special Regions')
->searchable(),
]);
}

public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('name')->sortable()->searchable(),
Tables\Columns\TextColumn::make('code')->sortable()->searchable(),
Tables\Columns\TextColumn::make('geoRegion.name')
->label('Geo Region')
->sortable()
->searchable(),
Tables\Columns\TextColumn::make('specialRegions.name')
->label('Special Regions')
->badge()
->separator(', ')
])
->filters([
SelectFilter::make('region_id')
->relationship('geoRegion', 'name')
->label('Geo Region'),
SelectFilter::make('specialRegions')
->relationship('specialRegions', 'name')
->label('Special Region'),
])
->actions([
Tables\Actions\ViewAction::make(),
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\DeleteBulkAction::make(),
]);
}

public static function getPages(): array
{
return [
'index' => ListCountries::route('/'),
'create' => CreateCountry::route('/create'),
'edit' => EditCountry::route('/{record}/edit'),
];
}
}
Loading
Loading