Archived
1
0
Fork 0

initial commit

This commit is contained in:
Henrik Hautakoski 2021-06-28 17:33:29 +01:00
commit 1e1aa7d461
215 changed files with 35140 additions and 0 deletions

View 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');
}
}

View 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)
]);
}
}

View 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';
}
}