Files
einundzwanzig-app/resources/views/livewire/cities/create.blade.php

115 lines
4.2 KiB
PHP

<?php
use App\Attributes\SeoDataAttribute;
use App\Models\City;
use App\Models\Country;
use App\Traits\SeoTrait;
use Livewire\Volt\Component;
new
#[SeoDataAttribute(key: 'cities_create')]
class extends Component {
use SeoTrait;
public $country = 'de';
public string $name = '';
public ?int $country_id = null;
public float $latitude = 0;
public float $longitude = 0;
public ?int $population = null;
public ?string $population_date = null;
public function mount(): void
{
$this->country = request()->route('country', config('app.domain_country'));
$this->country_id = Country::query()
->where('code', $this->country)
->value('id');
}
public function createCity(): void
{
$validated = $this->validate([
'name' => ['required', 'string', 'max:255', 'unique:cities,name'],
'country_id' => ['required', 'exists:countries,id'],
'latitude' => ['required', 'numeric', 'between:-90,90'],
'longitude' => ['required', 'numeric', 'between:-180,180'],
'population' => ['nullable', 'integer', 'min:0'],
'population_date' => ['nullable', 'string', 'max:255'],
]);
$validated['slug'] = str($validated['name'])->slug();
$validated['created_by'] = auth()->id();
$city = City::create($validated);
session()->flash('status', __('City successfully created!'));
$this->redirect(route_with_country('cities.index'), navigate: true);
}
public function with(): array
{
return [
'countries' => Country::query()->orderBy('name')->get(),
];
}
}; ?>
<div>
<div class="mb-6">
<flux:heading size="xl">{{ __('Create City') }}</flux:heading>
</div>
<form wire:submit="createCity" class="space-y-8">
<flux:fieldset>
<flux:legend>{{ __('Basic Information') }}</flux:legend>
<div class="space-y-6">
<flux:input label="{{ __('Name') }}" wire:model="name" required/>
<flux:select variant="listbox" searchable label="{{ __('Country') }}" wire:model="country_id" required>
<flux:select.option value="">{{ __('Select a country') }}</flux:select.option>
@foreach($countries as $country)
<flux:select.option value="{{ $country->id }}">
<div class="flex items-center space-x-2">
<img alt="{{ str($country->code)->lower() }}"
src="{{ asset('vendor/blade-flags/country-'.str($country->code)->lower().'.svg') }}"
width="24" height="12"/>
<span>{{ $country->name }}</span>
</div>
</flux:select.option>
@endforeach
</flux:select>
</div>
</flux:fieldset>
<flux:fieldset>
<flux:legend>{{ __('Coordinates') }}</flux:legend>
<div class="grid grid-cols-2 gap-x-4 gap-y-6">
<flux:input label="{{ __('Latitude') }}" type="number" step="any" wire:model="latitude" required/>
<flux:input label="{{ __('Longitude') }}" type="number" step="any" wire:model="longitude" required/>
</div>
<div class="my-2">
<flux:link href="https://www.mappr.co/latitude-longitude-finder/">https://www.mappr.co/latitude-longitude-finder/</flux:link>
</div>
</flux:fieldset>
<flux:fieldset>
<flux:legend>{{ __('Demographics') }}</flux:legend>
<div class="grid grid-cols-2 gap-x-4 gap-y-6">
<flux:input label="{{ __('Population') }}" type="number" wire:model="population"/>
<flux:input label="{{ __('Population Date') }}" wire:model="population_date" placeholder="e.g. 2024"/>
</div>
</flux:fieldset>
<div class="flex gap-4">
<flux:button type="submit" variant="primary">{{ __('Create City') }}</flux:button>
<flux:button :href="route_with_country('cities.index')" variant="ghost">{{ __('Cancel') }}</flux:button>
</div>
</form>
</div>