Updated project for admin panel
This commit is contained in:
parent
984d2eeae6
commit
282e5ccc46
63
app/Http/Controllers/Dashboard/ProjectController.php
Normal file
63
app/Http/Controllers/Dashboard/ProjectController.php
Normal 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 .'"');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
37
app/Http/Requests/ProjectRequest.php
Normal file
37
app/Http/Requests/ProjectRequest.php
Normal 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',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -23,7 +23,8 @@ class ProjectResource extends JsonResource
|
|||||||
'categories' => $this->categories,
|
'categories' => $this->categories,
|
||||||
'author' => $this->author,
|
'author' => $this->author,
|
||||||
'images' => $this->images,
|
'images' => $this->images,
|
||||||
'release_data' => $this->release_data,
|
'release_date' => $this->release_date,
|
||||||
|
'update_date' => $this->release_date,
|
||||||
'project_url' => $this->project_url,
|
'project_url' => $this->project_url,
|
||||||
'project_version' => $this->project_version,
|
'project_version' => $this->project_version,
|
||||||
'description' => $this->description,
|
'description' => $this->description,
|
||||||
|
@ -25,6 +25,8 @@ class Project extends Model
|
|||||||
|
|
||||||
// use HasFactory;
|
// use HasFactory;
|
||||||
|
|
||||||
|
protected $dateFormat = 'Y-m-d';
|
||||||
|
|
||||||
protected $guarded = [];
|
protected $guarded = [];
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
'id' => 'integer',
|
'id' => 'integer',
|
||||||
@ -32,10 +34,34 @@ class Project extends Model
|
|||||||
'categories' => 'array',
|
'categories' => 'array',
|
||||||
'author' => 'string',
|
'author' => 'string',
|
||||||
'images' => 'array',
|
'images' => 'array',
|
||||||
'release_data' => 'datetime:d-m-Y',
|
'release_date' => 'datetime:Y-m-d',
|
||||||
|
'update_date' => 'datetime:Y-m-d',
|
||||||
'project_url' => 'string',
|
'project_url' => 'string',
|
||||||
'project_version' => 'string',
|
'project_version' => 'string',
|
||||||
'description' => '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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ class ProjectRepository implements ProjectRepositoryInterface
|
|||||||
$toSave['author'] = $data['author'];
|
$toSave['author'] = $data['author'];
|
||||||
|
|
||||||
if (isset($data['release_date']))
|
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']))
|
if (isset($data['project_url']))
|
||||||
$toSave['project_url'] = $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']))
|
if (isset($data['categories']) && is_array($data['categories']))
|
||||||
$toSave['categories'] = $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']))
|
if (isset($data['images']) && is_array($data['images']))
|
||||||
$toSave['images'] = $data['images'];
|
$toSave['images'] = $data['images'];
|
||||||
|
|
||||||
if (isset($data['update_date']) && !empty($data['update_date']))
|
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;
|
return $toSave;
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,7 @@ class DatabaseSeeder extends Seeder
|
|||||||
public function run()
|
public function run()
|
||||||
{
|
{
|
||||||
// \App\Models\User::factory(10)->create();
|
// \App\Models\User::factory(10)->create();
|
||||||
$this->call(
|
$this->call(CategorySeeder::class);
|
||||||
CategorySeeder::class
|
$this->call(UserSeeder::class);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
25
database/seeders/UserSeeder.php
Normal file
25
database/seeders/UserSeeder.php
Normal 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^')
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
16
resources/sass/tags/form.scss
vendored
16
resources/sass/tags/form.scss
vendored
@ -1,10 +1,22 @@
|
|||||||
form {
|
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;
|
display: block;
|
||||||
margin: 5px 10px;
|
margin: 5px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input, textarea {
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
}
|
}
|
||||||
span.error {
|
span.error {
|
||||||
|
76
resources/views/dashboard/projects/create.blade.php
Normal file
76
resources/views/dashboard/projects/create.blade.php
Normal 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
|
14
resources/views/dashboard/projects/delete.blade.php
Normal file
14
resources/views/dashboard/projects/delete.blade.php
Normal 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
|
78
resources/views/dashboard/projects/edit.blade.php
Normal file
78
resources/views/dashboard/projects/edit.blade.php
Normal 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
|
@ -1,11 +1,11 @@
|
|||||||
<div class="projects">
|
<div class="projects">
|
||||||
<header><h1>Projekty</h1></header>
|
<header><h1>Projekty</h1></header>
|
||||||
<a href="{{ route('admin.category.create') }}">
|
<a href="{{ route('admin.project.create') }}">
|
||||||
<button>Utwórz nowy projekt</button>
|
<button>Utwórz nowy projekt</button>
|
||||||
</a>
|
</a>
|
||||||
<ul class="project_items">
|
<ul class="project_items">
|
||||||
@foreach ($projects as $project)
|
@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
|
@endforeach
|
||||||
<ul>
|
<ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -21,19 +21,41 @@ Route::name('admin.')->group(function () {
|
|||||||
->name('create');
|
->name('create');
|
||||||
Route::post('', 'CategoryController@store')
|
Route::post('', 'CategoryController@store')
|
||||||
->name('store');
|
->name('store');
|
||||||
|
|
||||||
Route::get('{category}', 'CategoryController@edit')
|
Route::get('{category}', 'CategoryController@edit')
|
||||||
->name('edit');
|
->name('edit');
|
||||||
Route::put('{category}', 'CategoryController@update')
|
Route::put('{category}', 'CategoryController@update')
|
||||||
->name('update');
|
->name('update');
|
||||||
|
|
||||||
Route::get('{category}/delete', 'CategoryController@delete')
|
Route::get('{category}/delete', 'CategoryController@delete')
|
||||||
->name('delete');
|
->name('delete');
|
||||||
Route::delete('{category}/delete', 'CategoryController@destroy')
|
Route::delete('{category}/delete', 'CategoryController@destroy')
|
||||||
->name('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::name('auth.')->namespace('Auth')->group(function () {
|
||||||
Route::get('login', 'LoginController@login')->name('login');
|
Route::get('login', 'LoginController@login')
|
||||||
Route::post('login', 'LoginController@authenticate')->name('authenticate');
|
->name('login');
|
||||||
Route::post('logout', 'LoginController@logout')->name('logout');
|
Route::post('login', 'LoginController@authenticate')
|
||||||
|
->name('authenticate');
|
||||||
|
Route::post('logout', 'LoginController@logout')
|
||||||
|
->name('logout');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user