initial commit
This commit is contained in:
commit
1e1aa7d461
215 changed files with 35140 additions and 0 deletions
121
app/Http/Livewire/Form/CreateCharacterForm.php
Normal file
121
app/Http/Livewire/Form/CreateCharacterForm.php
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Livewire\Form;
|
||||
|
||||
use App\Models\Character;
|
||||
use App\Warcraft\Classes;
|
||||
use App\Warcraft\Races;
|
||||
|
||||
use Livewire\Component;
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
|
||||
class CreateCharacterForm extends Component
|
||||
{
|
||||
use AuthorizesRequests;
|
||||
|
||||
/**
|
||||
* Character's name
|
||||
*/
|
||||
public string $name = '';
|
||||
|
||||
/**
|
||||
* Character's level
|
||||
*/
|
||||
public string $level = '70';
|
||||
|
||||
/**
|
||||
* All possible classes
|
||||
*/
|
||||
public $classes;
|
||||
|
||||
/**
|
||||
* Character's class
|
||||
*/
|
||||
public string $class = '';
|
||||
|
||||
/**
|
||||
* All possible races
|
||||
*/
|
||||
public $races;
|
||||
|
||||
/**
|
||||
* Character's race
|
||||
*/
|
||||
public string $race = '';
|
||||
|
||||
/**
|
||||
* All posible genders
|
||||
*/
|
||||
public $genders = [
|
||||
'M' => 'Male',
|
||||
'F' => 'Female'
|
||||
];
|
||||
|
||||
/**
|
||||
* Character gender
|
||||
*/
|
||||
public $gender = 'M';
|
||||
|
||||
/**
|
||||
* Validation rules
|
||||
*/
|
||||
protected $rules = [
|
||||
'name' => 'required|alpha|min:2|max:12|unique:characters,name',
|
||||
'level' => 'required|integer|min:1|max:70',
|
||||
'gender' => 'required|in:M,F',
|
||||
'race' => 'required',
|
||||
'class' => 'required'
|
||||
];
|
||||
|
||||
public function mount()
|
||||
{
|
||||
$this->races = (new Races)->alliance();
|
||||
$rules['race'] = 'required|in:' . $this->races->keys()->join(',');
|
||||
|
||||
$this->race = $this->races->keys()->first();
|
||||
$this->updatedRace($this->race);
|
||||
}
|
||||
|
||||
public function updated($propertyName)
|
||||
{
|
||||
$this->validateOnly($propertyName);
|
||||
}
|
||||
|
||||
public function updatedRace($race)
|
||||
{
|
||||
// Update classes list for this race.
|
||||
$this->classes = (new Classes)->race($this->race);
|
||||
|
||||
// Update validation rules
|
||||
$rules['class'] = 'required|in:' . $this->classes->keys()->join(',');
|
||||
|
||||
// if this race can not be the selected class.
|
||||
// select the first one.
|
||||
if (!$this->classes->has($this->class)) {
|
||||
$this->class = $this->classes->keys()->first();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the character
|
||||
*/
|
||||
public function save()
|
||||
{
|
||||
$this->authorize('create', Character::class);
|
||||
|
||||
$data = $this->validate();
|
||||
|
||||
$user = auth()->user();
|
||||
$character = $user->characters()->create($data);
|
||||
|
||||
// Livewire redirect() does not have "with" method.
|
||||
// so we call session()->flash() directly instead.
|
||||
session()->flash('success', "<strong>{$character->name}</strong> was created!");
|
||||
return redirect()->route('user.index');
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return view('livewire.form.character');
|
||||
}
|
||||
}
|
||||
84
app/Http/Livewire/Recipes.php
Normal file
84
app/Http/Livewire/Recipes.php
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Livewire;
|
||||
|
||||
use App\Models\Profession;
|
||||
use App\Models\Recipe;
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
use Livewire\Component;
|
||||
|
||||
class Recipes extends Component
|
||||
{
|
||||
use Traits\WithPagination;
|
||||
|
||||
protected $queryString = [
|
||||
'name' => ['except' => ''],
|
||||
'crafter' => ['except' => ''],
|
||||
'profession' => ['except' => '']
|
||||
];
|
||||
|
||||
/**
|
||||
* Filter by name
|
||||
*/
|
||||
public string $name = '';
|
||||
|
||||
/**
|
||||
* Filter by profession
|
||||
*/
|
||||
public string $profession = '';
|
||||
|
||||
/**
|
||||
* Filter by crafter
|
||||
*/
|
||||
public string $crafter = '';
|
||||
|
||||
/**
|
||||
* List of all professions.
|
||||
*/
|
||||
public array $profession_options = [];
|
||||
|
||||
public function mount()
|
||||
{
|
||||
// Build professions select list.
|
||||
$options = Profession::all()->mapWithKeys(function ($item) {
|
||||
return [Str::lower($item['name']) => $item['name']];
|
||||
});
|
||||
|
||||
$this->profession_options = collect(['' => '-- Profession --'])
|
||||
->merge($options)
|
||||
->toArray();
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
$query = Recipe::select('recipes.*')
|
||||
->join('items', 'items.id', '=', 'recipes.item_id')
|
||||
->orderBy('items.name');
|
||||
|
||||
// Filter by name
|
||||
if (strlen($this->name) >= 3) {
|
||||
$query->whereHas('craft', function ($q) {
|
||||
$q->where('name', 'LIKE', '%' . $this->name . '%');
|
||||
});
|
||||
}
|
||||
|
||||
// Filter by profession
|
||||
if (strlen($this->profession)) {
|
||||
$query->whereHas('profession', function ($q) {
|
||||
$q->where('name', Str::ucfirst($this->profession));
|
||||
});
|
||||
}
|
||||
|
||||
// Filter by crafter
|
||||
if (strlen($this->crafter) >= 3) {
|
||||
$query->whereHas('crafters', function ($q) {
|
||||
$q->where('name', 'LIKE', '%' . $this->crafter . '%');
|
||||
});
|
||||
}
|
||||
|
||||
return view('livewire.recipes', [
|
||||
'recipes' => $query->paginate($this->perPage)
|
||||
]);
|
||||
}
|
||||
}
|
||||
15
app/Http/Livewire/Traits/WithPagination.php
Normal file
15
app/Http/Livewire/Traits/WithPagination.php
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Livewire\Traits;
|
||||
|
||||
trait WithPagination
|
||||
{
|
||||
use \Livewire\WithPagination;
|
||||
|
||||
public $perPage = 15;
|
||||
|
||||
public function paginationView()
|
||||
{
|
||||
return 'pagination.default';
|
||||
}
|
||||
}
|
||||
Reference in a new issue