diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 24149f1..cd4d0de 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; @@ -15,6 +16,9 @@ class LoginController extends Controller public function authenticate(Request $request) { + if (Auth::check()) + return redirect()->route('admin.home'); + $credentials = $request->validate([ 'email' => ['required', 'email'], 'password' => ['required'], @@ -39,8 +43,11 @@ class LoginController extends Controller return redirect()->route('admin.auth.login'); } - public function login(): View + public function login(): View|RedirectResponse { + if (Auth::check()) + return redirect()->route('admin.home'); + return view('auth.login'); } diff --git a/app/Http/Controllers/Dashboard/AdminPanelController.php b/app/Http/Controllers/Dashboard/AdminPanelController.php index 87c273f..bae51f8 100644 --- a/app/Http/Controllers/Dashboard/AdminPanelController.php +++ b/app/Http/Controllers/Dashboard/AdminPanelController.php @@ -3,6 +3,8 @@ namespace App\Http\Controllers\Dashboard; use App\Http\Controllers\Controller; +use App\Repository\Interfaces\CategoryRepository; +use App\Repository\Interfaces\ProjectRepository; use Illuminate\Http\Request; use Illuminate\View\View; @@ -10,12 +12,18 @@ class AdminPanelController extends Controller { public function __construct( - - ) {} + private CategoryRepository $categoryRepository, + private ProjectRepository $projectRepository + ) { + $this->categoryRepository->auth = true; + } public function __invoke(Request $request): View { - return view('dashboard.home'); + $categories = $this->categoryRepository->all(); + $projects = $this->projectRepository->all(); + + return view('dashboard.home', compact('categories', 'projects')); } } diff --git a/app/Http/Controllers/Dashboard/CategoryController.php b/app/Http/Controllers/Dashboard/CategoryController.php new file mode 100644 index 0000000..2636944 --- /dev/null +++ b/app/Http/Controllers/Dashboard/CategoryController.php @@ -0,0 +1,63 @@ +validated(); + if ($this->categoryRepository->update($category, $validate)) { + return back()->with('message', 'Zaktualizowano kategorię!'); + } + + return back()->withError(['message_error', 'Wystąpił błąd podczas aktualizacji!']); + } + + public function store(CategoryRequest $request) + { + $validate = $request->validated(); + if ($category = $this->categoryRepository->create($validate)) { + return redirect()->route('admin.category.update', ['category' => $category])->with('message', 'Utworzono kategorię!'); + } + + return back()->withError(['message_error', 'Wystąpił błąd podczas tworzenia!']); + } + + public function create(): View + { + return view('dashboard.categories.create'); + } + + public function edit(Category $category): View + { + return view('dashboard.categories.edit', compact('category')); + } + + public function delete(Category $category): View + { + return view('dashboard.categories.delete', compact('category')); + } + + public function destroy(Category $category): RedirectResponse + { + $name = $category->name; + $category->delete(); + + return redirect()->route('admin.home')->with('message', 'Usunięto kategorię "'. $name .'"'); + } + +} diff --git a/app/Http/Requests/CategoryRequest.php b/app/Http/Requests/CategoryRequest.php new file mode 100644 index 0000000..3eac9bf --- /dev/null +++ b/app/Http/Requests/CategoryRequest.php @@ -0,0 +1,34 @@ + 'required|string|min:3|max:25', + 'slug' => 'required|string|min:3|max:25', + 'priority' => 'required|numeric|min:0|max:10', + 'default' => 'nullable|in:yes,1,true,on', + 'visible' => 'nullable|in:yes,1,true,on' + ]; + } +} diff --git a/app/Models/Category.php b/app/Models/Category.php index 8da8aec..78fbf5e 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -2,7 +2,7 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; /** @@ -25,4 +25,13 @@ class Category extends Model 'default' => 'bool', 'visible' => 'bool' ]; + + public function scopeVisibled(Builder $builder) + { + return $builder->where(function (Builder $query) { + $query->where('visible', true) + ->orWhere('default', true); + }); + } + } diff --git a/app/Repository/CategoryRepository.php b/app/Repository/CategoryRepository.php index 5943f0e..c60b68a 100644 --- a/app/Repository/CategoryRepository.php +++ b/app/Repository/CategoryRepository.php @@ -13,6 +13,8 @@ use Illuminate\Support\Collection; class CategoryRepository implements CategoryRepositoryInterface { + public bool $auth = false; + public function __construct( private Category $category ) {} @@ -22,8 +24,12 @@ class CategoryRepository implements CategoryRepositoryInterface $categories = $this->category ->query() ->orderby('priority', 'ASC') - ->orderby('name', 'ASC')->get(); - return (new CategoryCollection($categories))->collection; + ->orderby('name', 'ASC'); + + if (!$this->auth) + $categories->visibled(); + + return (new CategoryCollection($categories->get()))->collection; } public function get(string $slug): CategoryResource @@ -32,12 +38,19 @@ class CategoryRepository implements CategoryRepositoryInterface ->query() ->where('slug', $slug) ->firstOrFail(); + + if (!$this->auth) + $category->visibled(); + return new CategoryResource($category); } public function update(Category $category, array $data = []): bool { $data = $this->parseToArray($data); + if (!$category->default && isset($data['default']) && $data['default'] === true) + $this->unsetDefault(); + return $category ->update($data); } @@ -45,11 +58,22 @@ class CategoryRepository implements CategoryRepositoryInterface public function create(array $data = []): Category { $data = $this->parseToArray($data); + if (isset($data['default']) && $data['default'] === true) + $this->unsetDefault(); + return $this->category ->query() ->create($data); } + private function unsetDefault(): void + { + $this->category + ->query() + ->where('default', true) + ->first()?->update(['default' => false]); + } + private function parseToArray(array $data = []): array { $toSave = []; @@ -58,10 +82,21 @@ class CategoryRepository implements CategoryRepositoryInterface $toSave['name'] = $data['name']; if (isset($data['slug']) && !empty($data['slug'])) $toSave['slug'] = $data['slug']; - if (isset($data['default']) && is_bool($data['default'])) - $toSave['default'] = $data['default']; - if (isset($data['visible']) && is_bool($data['visible'])) - $toSave['visible'] = $data['visible']; + if (isset($data['priority']) && !is_integer($data['priority'])) + $toSave['priority'] = (int)$data['priority']; + + if ( + isset($data['default']) && + in_array($data['default'], ['yes', 'on', 1, true]) + ) $toSave['default'] = true; + else $toSave['default'] = false; + + if ( + (isset($toSave['default']) && $toSave['default'] === true) || + (isset($data['visible']) && + in_array($data['visible'], ['yes', 'on', 1, true])) + ) $toSave['visible'] = true; + else $toSave['visible'] = false; return $toSave; } diff --git a/public/js/app.js b/public/js/app.js index 70cd2a4..683ac7d 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -19318,6 +19318,19 @@ __webpack_require__.r(__webpack_exports__); // extracted by mini-css-extract-plugin +/***/ }), + +/***/ "./resources/sass/dashboard.scss": +/*!***************************************!*\ + !*** ./resources/sass/dashboard.scss ***! + \***************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +// extracted by mini-css-extract-plugin + + /***/ }), /***/ "./node_modules/process/browser.js": @@ -19636,6 +19649,7 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded /******/ var installedChunks = { /******/ "/js/app": 0, +/******/ "css/dashboard": 0, /******/ "css/app": 0 /******/ }; /******/ @@ -19686,8 +19700,9 @@ module.exports = JSON.parse('{"name":"axios","version":"0.21.4","description":"P /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module depends on other loaded chunks and execution need to be delayed -/******/ __webpack_require__.O(undefined, ["css/app"], () => (__webpack_require__("./resources/js/app.js"))) -/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["css/app"], () => (__webpack_require__("./resources/sass/app.scss"))) +/******/ __webpack_require__.O(undefined, ["css/dashboard","css/app"], () => (__webpack_require__("./resources/js/app.js"))) +/******/ __webpack_require__.O(undefined, ["css/dashboard","css/app"], () => (__webpack_require__("./resources/sass/app.scss"))) +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["css/dashboard","css/app"], () => (__webpack_require__("./resources/sass/dashboard.scss"))) /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); /******/ /******/ })() diff --git a/public/mix-manifest.json b/public/mix-manifest.json index 2d60117..8efbb01 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,4 +1,5 @@ { "/js/app.js": "/js/app.js", + "/css/dashboard.css": "/css/dashboard.css", "/css/app.css": "/css/app.css" } diff --git a/resources/sass/dashboard.scss b/resources/sass/dashboard.scss new file mode 100644 index 0000000..63e785c --- /dev/null +++ b/resources/sass/dashboard.scss @@ -0,0 +1 @@ +@import "./dashboard/categories" diff --git a/resources/sass/dashboard/categories.scss b/resources/sass/dashboard/categories.scss new file mode 100644 index 0000000..a10593b --- /dev/null +++ b/resources/sass/dashboard/categories.scss @@ -0,0 +1,5 @@ +.categories { + .category { + display: block; + } +} diff --git a/resources/views/dashboard/categories/create.blade.php b/resources/views/dashboard/categories/create.blade.php new file mode 100644 index 0000000..3d90c54 --- /dev/null +++ b/resources/views/dashboard/categories/create.blade.php @@ -0,0 +1,49 @@ +@extends('layout.app') +@section('title', 'Utwórz kategorię') + +@section('main') +@if (\Session::has('message')) + {{ \Session::get('message') }} +@endif +@if ($errors->any()) +