Updated project for admin panel

This commit is contained in:
Kamil Niemczycki 2022-02-15 22:35:59 +01:00
parent 984d2eeae6
commit 282e5ccc46
13 changed files with 371 additions and 14 deletions

View File

@ -0,0 +1,63 @@
<?php
namespace App\Http\Controllers\Dashboard;
use App\Http\Requests\ProjectRequest;
use App\Models\Project;
use App\Repository\Interfaces\ProjectRepository;
use Carbon\Carbon;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
class ProjectController
{
public function __construct(
private ProjectRepository $projectRepository
) {}
public function edit(Project $project): View
{
return view('dashboard.projects.edit', compact('project'));
}
public function update(ProjectRequest $request, Project $project): RedirectResponse
{
$validated = $request->validated();
if ($this->projectRepository->update($project, $validated)) {
return back()->with('message', 'Zaktualizowano projekt!');
}
return back()->withError(['message_error', 'Wystąpił błąd podczas aktualizacji!']);
}
public function create(): View
{
return view('dashboard.projects.create');
}
public function store(ProjectRequest $request): RedirectResponse
{
$validated = $request->validated();
if ($project = $this->projectRepository->create($validated)) {
return redirect()
->route('admin.project.update', compact('project'))
->with('message', 'Utworzono projekt!');
}
return back()->withError(['message_error', 'Wystąpił błąd podczas tworzenia!']);
}
public function delete(Project $project): View
{
return view('dashboard.projects.delete', compact('project'));
}
public function destroy(Project $project): RedirectResponse
{
$title = $project->title;
$project->delete();
return redirect()->route('admin.home')->with('message', 'Usunięto projekt "'. $title .'"');
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProjectRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|string|min:3|max:255',
'author' => 'required|string|min:3|max:50',
'categories' => 'nullable|string',
'release_date' => 'required|date:Y-m-d',
'update_date' => 'nullable|date:Y-m-d',
'project_url' => 'nullable|string',
'project_version' => 'nullable|string',
'description' => 'nullable|string',
];
}
}

View File

@ -23,7 +23,8 @@ class ProjectResource extends JsonResource
'categories' => $this->categories,
'author' => $this->author,
'images' => $this->images,
'release_data' => $this->release_data,
'release_date' => $this->release_date,
'update_date' => $this->release_date,
'project_url' => $this->project_url,
'project_version' => $this->project_version,
'description' => $this->description,

View File

@ -25,6 +25,8 @@ class Project extends Model
// use HasFactory;
protected $dateFormat = 'Y-m-d';
protected $guarded = [];
protected $casts = [
'id' => 'integer',
@ -32,10 +34,34 @@ class Project extends Model
'categories' => 'array',
'author' => 'string',
'images' => 'array',
'release_data' => 'datetime:d-m-Y',
'release_date' => 'datetime:Y-m-d',
'update_date' => 'datetime:Y-m-d',
'project_url' => 'string',
'project_version' => 'string',
'description' => 'string'
];
public function getReleaseDateAttribute($value): String
{
return $value;
}
public function setReleaseDateAttribute($value): void
{
$this->attributes['release_date'] = $value;
}
public function getUpdateDateAttribute($value): String|null
{
return $value;
}
public function setUpdateDateAttribute($value): void
{
if (!is_null($value))
$this->attributes['update_date'] = $value;
else
$this->attributes['update_date'] = null;
}
}

View File

@ -63,7 +63,7 @@ class ProjectRepository implements ProjectRepositoryInterface
$toSave['author'] = $data['author'];
if (isset($data['release_date']))
$toSave['release_date'] = Carbon::createFromFormat('Y-d-m', $data['release_date']);
$toSave['release_date'] = $data['release_date'];
if (isset($data['project_url']))
$toSave['project_url'] = $data['project_url'];
@ -76,12 +76,16 @@ class ProjectRepository implements ProjectRepositoryInterface
if (isset($data['categories']) && is_array($data['categories']))
$toSave['categories'] = $data['categories'];
else if (isset($data['categories']) && !empty($data['categories']))
$toSave['categories'] = explode(',', str_replace(', ', ',', $data['categories']));
if (isset($data['images']) && is_array($data['images']))
$toSave['images'] = $data['images'];
if (isset($data['update_date']) && !empty($data['update_date']))
$toSave['update_date'] = Carbon::createFromFormat('Y-d-m', $data['update_date']);
$toSave['update_date'] = $data['update_date'];
else
$toSave['update_date'] = null;
return $toSave;
}

View File

@ -14,8 +14,7 @@ class DatabaseSeeder extends Seeder
public function run()
{
// \App\Models\User::factory(10)->create();
$this->call(
CategorySeeder::class
);
$this->call(CategorySeeder::class);
$this->call(UserSeeder::class);
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
User::query()
->create([
'name' => 'Kamil Niemczycki',
'email' => 'admin@admin.pl',
'password' => Hash::make('password123^')
]);
}
}

View File

@ -1,10 +1,22 @@
form {
label, input {
max-width: 600px;
input[type="text"], input[type="date"], textarea {
width: 100%;
}
.form textarea {
min-width: 100%;
max-width: 100%;
min-height: 250px;
}
label, input, textarea {
display: block;
margin: 5px 10px;
}
input {
input, textarea {
padding: 5px 10px;
}
span.error {

View File

@ -0,0 +1,76 @@
@extends('layout.app')
@section('title', 'Utwórz projekt')
@section('main')
@if (\Session::has('message'))
<span>{{ \Session::get('message') }}</span>
@endif
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form class="form" method="POST" action="{{ route('admin.project.store') }}">
@csrf
<label for="title">Tytuł projektu</label>
<input id="title" type="text" name="title" value="{{ old('title') }}" placeholder="Tytuł">
@error('title')
<span class="error">{{ $message }}</span>
@enderror
<label for="author">Autor</label>
<input id="author" type="text" name="author" value="{{ old('author') }}" placeholder="Imię i nazwisko">
@error('author')
<span class="error">{{ $message }}</span>
@enderror
<label for="categories">Kategorie</label>
<input id="categories" type="text" name="categories" value="{{ old('categories') }}" placeholder="kategoria1, kategoria2">
@error('categories')
<span class="error">{{ $message }}</span>
@enderror
<label for="release_date">Data wydania</label>
<input id="release_date" type="date" name="release_date" value="{{ old('release_date') }}">
@error('release_date')
<span class="error">{{ $message }}</span>
@enderror
<label for="update_date">Data aktualizacji</label>
<input id="update_date" type="date" name="update_date" value="{{ old('update_date') }}">
@error('update_date')
<span class="error">{{ $message }}</span>
@enderror
<label for="project_url">Adres projektu</label>
<input id="project_url" type="text" name="project_url" value="{{ old('project_url') }}" placeholder="Adres www">
@error('project_url')
<span class="error">{{ $message }}</span>
@enderror
<label for="project_version">Wersja projektu</label>
<input id="project_version" type="text" name="project_version" value="{{ old('project_version') }}" placeholder="v1.0.0">
@error('project_version')
<span class="error">{{ $message }}</span>
@enderror
<label for="description">Opis</label>
<textarea id="description" name="description" placeholder="Ładny opis projektu">{{ old('description') }}</textarea>
@error('description')
<span class="error">{{ $message }}</span>
@enderror
<label for="visible">Visible</label>
<input id="visible" type="checkbox" name="visible" {{ old('visible') != 0 ? 'checked' : '' }}>
<input type="submit" value="Utwórz">
</form>
<div>
<a href="{{ route('admin.home') }}"><< Cofnij</a>
</div>
@endsection

View File

@ -0,0 +1,14 @@
@extends('layout.app')
@section('title', 'Delete project')
@section('main')
<form method="POST" action="{{ route('admin.project.destroy', compact('project')) }}">
@method('DELETE')
@csrf
Czy jesteś pewien, że chcesz usunąć projekt "{{ $project->title }}"?
<input type="submit" value="Tak, usuń!">
</form>
<div>
<a href="{{ route('admin.project.edit', compact('project')) }}"><< Cofnij</a>
</div>
@endsection

View File

@ -0,0 +1,78 @@
@extends('layout.app')
@section('title', 'Login')
@section('main')
@if (\Session::has('message'))
<span>{{ \Session::get('message') }}</span>
@endif
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form class="form" method="POST" action="{{ route('admin.project.update', compact('project')) }}">
@method('PUT')
@csrf
<label for="title">Tytuł projektu</label>
<input id="title" type="text" name="title" value="{{ old('title', $project->title) }}" placeholder="Tytuł">
@error('title')
<span class="error">{{ $message }}</span>
@enderror
<label for="author">Autor</label>
<input id="author" type="text" name="author" value="{{ old('author', $project->author) }}" placeholder="Imię i nazwisko">
@error('author')
<span class="error">{{ $message }}</span>
@enderror
<label for="categories">Kategorie</label>
<input id="categories" type="text" name="categories" value="{{ old('categories', implode(', ', $project->categories)) }}" placeholder="kategoria1, kategoria2">
@error('categories')
<span class="error">{{ $message }}</span>
@enderror
<label for="release_date">Data wydania</label>
<input id="release_date" type="date" name="release_date" value="{{ old('release_date', $project->release_date) }}">
@error('release_date')
<span class="error">{{ $message }}</span>
@enderror
<label for="update_date">Data aktualizacji</label>
<input id="update_date" type="date" name="update_date" value="{{ old('update_date', $project->update_date) }}">
@error('update_date')
<span class="error">{{ $message }}</span>
@enderror
<label for="project_url">Adres projektu</label>
<input id="project_url" type="text" name="project_url" value="{{ old('project_url', $project->project_url) }}" placeholder="Adres www">
@error('project_url')
<span class="error">{{ $message }}</span>
@enderror
<label for="project_version">Wersja projektu</label>
<input id="project_version" type="text" name="project_version" value="{{ old('project_version', $project->project_version) }}" placeholder="v1.0.0">
@error('project_version')
<span class="error">{{ $message }}</span>
@enderror
<label for="description">Opis</label>
<textarea id="description" name="description" placeholder="Ładny opis projektu">{{ old('description', $project->description) }}</textarea>
@error('description')
<span class="error">{{ $message }}</span>
@enderror
<label for="visible">Visible</label>
<input id="visible" type="checkbox" name="visible" {{ old('visible') != 0 ? 'checked' : '' }}>
<input type="submit" value="Aktualizuj">
</form>
<div>
<a href="{{ route('admin.project.delete', compact('project')) }}">USUŃ!</a><br>
<a href="{{ route('admin.home') }}"><< Cofnij</a>
</div>
@endsection

View File

@ -1,11 +1,11 @@
<div class="projects">
<header><h1>Projekty</h1></header>
<a href="{{ route('admin.category.create') }}">
<a href="{{ route('admin.project.create') }}">
<button>Utwórz nowy projekt</button>
</a>
<ul class="project_items">
@foreach ($projects as $project)
<li class="project_element">{{ $project->title }} | <a href="{{ route('admin.category.edit', ['category' => $project->id]) }}">Edytuj</a></li>
<li class="project_element">{{ $project->title }} | <a href="{{ route('admin.project.edit', compact('project')) }}">Edytuj</a></li>
@endforeach
<ul>
</div>

View File

@ -21,19 +21,41 @@ Route::name('admin.')->group(function () {
->name('create');
Route::post('', 'CategoryController@store')
->name('store');
Route::get('{category}', 'CategoryController@edit')
->name('edit');
Route::put('{category}', 'CategoryController@update')
->name('update');
Route::get('{category}/delete', 'CategoryController@delete')
->name('delete');
Route::delete('{category}/delete', 'CategoryController@destroy')
->name('destroy');
});
Route::name('project.')->prefix('project')->group(function () {
Route::get('create', 'ProjectController@create')
->name('create');
Route::post('', 'ProjectController@store')
->name('store');
Route::get('{project}', 'ProjectController@edit')
->name('edit');
Route::put('{project}', 'ProjectController@update')
->name('update');
Route::get('{project}/delete', 'ProjectController@delete')
->name('delete');
Route::delete('{project}/delete', 'ProjectController@destroy')
->name('destroy');
});
});
Route::name('auth.')->namespace('Auth')->group(function () {
Route::get('login', 'LoginController@login')->name('login');
Route::post('login', 'LoginController@authenticate')->name('authenticate');
Route::post('logout', 'LoginController@logout')->name('logout');
Route::get('login', 'LoginController@login')
->name('login');
Route::post('login', 'LoginController@authenticate')
->name('authenticate');
Route::post('logout', 'LoginController@logout')
->name('logout');
});
});