From a1e262602fe334e081fe5054ccfa45bab7426bc0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 14 Nov 2021 15:17:27 +0100 Subject: [PATCH 01/56] composer: require blade-ui-kit/blade-heroicons --- composer.json | 1 + composer.lock | 152 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 152 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 6a653e5..4aa4e68 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "license": "MIT", "require": { "php": "^7.3|^8.0", + "blade-ui-kit/blade-heroicons": "^1.2", "fruitcake/laravel-cors": "^2.0", "guzzlehttp/guzzle": "^7.0.1", "laravel/framework": "^8.54", diff --git a/composer.lock b/composer.lock index 0d75bfe..1569131 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6d2513918caf2a8560710d583f142529", + "content-hash": "6252463cf5fd4e38704fc7c23c2cf7cb", "packages": [ { "name": "asm89/stack-cors", @@ -62,6 +62,156 @@ }, "time": "2021-03-11T06:42:03+00:00" }, + { + "name": "blade-ui-kit/blade-heroicons", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-heroicons.git", + "reference": "99d82616a72e36492edc9b95c6a2112d8632e9a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/99d82616a72e36492edc9b95c6a2112d8632e9a7", + "reference": "99d82616a72e36492edc9b95c6a2112d8632e9a7", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.0", + "illuminate/support": "^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Heroicons\\BladeHeroiconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Heroicons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of Heroicons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-heroicons", + "keywords": [ + "Heroicons", + "blade", + "laravel" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-heroicons/issues", + "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-05-05T14:59:46+00:00" + }, + { + "name": "blade-ui-kit/blade-icons", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-icons.git", + "reference": "548869bc820a25f803530c82028482aefe08115f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/548869bc820a25f803530c82028482aefe08115f", + "reference": "548869bc820a25f803530c82028482aefe08115f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/support": "^8.0", + "illuminate/view": "^8.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3", + "symfony/finder": "^5.3" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Icons\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-icons/issues", + "source": "https://github.com/blade-ui-kit/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-08-11T10:09:06+00:00" + }, { "name": "brick/math", "version": "0.9.3", From 43c22ded66d416f71e07990c90c9bef8ed14c8f8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 14 Nov 2021 15:36:08 +0100 Subject: [PATCH 02/56] composer: require pnx/laravel-ignite --- composer.json | 7 +++++++ composer.lock | 52 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 4aa4e68..8cc46fe 100644 --- a/composer.json +++ b/composer.json @@ -12,6 +12,7 @@ "laravel/framework": "^8.54", "laravel/tinker": "^2.5", "livewire/livewire": "^2.5", + "pnx/laravel-ignite": "9999999-dev", "vinkla/hashids": "^9.1" }, "require-dev": { @@ -23,6 +24,12 @@ "nunomaduro/collision": "^5.0", "phpunit/phpunit": "^9.3.3" }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/pnx/laravel-ignite" + } + ], "autoload": { "psr-4": { "App\\": "app/", diff --git a/composer.lock b/composer.lock index 1569131..c20fe9b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6252463cf5fd4e38704fc7c23c2cf7cb", + "content-hash": "698201d881ac8e6d8821208ad918f5f6", "packages": [ { "name": "asm89/stack-cors", @@ -2473,6 +2473,52 @@ ], "time": "2021-08-28T21:27:29+00:00" }, + { + "name": "pnx/laravel-ignite", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/pnx/laravel-ignite.git", + "reference": "5d3da73f8e5d73e70c383f7a9d66dfee1774f726" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pnx/laravel-ignite/zipball/5d3da73f8e5d73e70c383f7a9d66dfee1774f726", + "reference": "5d3da73f8e5d73e70c383f7a9d66dfee1774f726", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Ignite\\FormServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Ignite\\": "src" + } + }, + "authors": [ + { + "name": "Henrik Hautakoski", + "email": "henrik.hautakoski@gmail.com" + } + ], + "support": { + "source": "https://github.com/pnx/laravel-ignite/tree/master", + "issues": "https://github.com/pnx/laravel-ignite/issues" + }, + "time": "2021-11-14T14:23:03+00:00" + }, { "name": "psr/container", "version": "1.1.1", @@ -8511,7 +8557,9 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": { + "pnx/laravel-ignite": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { From 1616487e4b7889cc5988b100c5194cffd295f65a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 14 Nov 2021 15:47:53 +0100 Subject: [PATCH 03/56] DB Migration: adding 2021_11_14_154143_create_admins_table.php --- .../2021_11_14_154143_create_admins_table.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 database/migrations/2021_11_14_154143_create_admins_table.php diff --git a/database/migrations/2021_11_14_154143_create_admins_table.php b/database/migrations/2021_11_14_154143_create_admins_table.php new file mode 100644 index 0000000..18ca7e8 --- /dev/null +++ b/database/migrations/2021_11_14_154143_create_admins_table.php @@ -0,0 +1,24 @@ +id(); + $table->string('username')->unique(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } +} From 7cfca48b7edf89c44cb97a93203fa97bda40f872 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 14 Nov 2021 18:26:30 +0100 Subject: [PATCH 04/56] tailwind.config.js: Add "odd" variant to background color. --- tailwind.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tailwind.config.js b/tailwind.config.js index 47b44b9..84e67e2 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -24,7 +24,9 @@ module.exports = { }, }, variants: { - extend: {}, + extend: { + backgroundColor: ['odd'], + }, }, plugins: [ plugin(function({ addUtilities }) { From 0f5779b1e6e8be9c725ae6d8b1a8698415ed1467 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 15:40:52 +0100 Subject: [PATCH 05/56] resources/views/layouts/app.blade.php: Add alpine js. --- resources/views/layouts/app.blade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index a18a1c4..4d8a931 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -6,6 +6,7 @@ Bingo! @livewireStyles + From 1f7b1d80ab4537a1a0e6a46377e05479fcdf79aa Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 16:02:36 +0100 Subject: [PATCH 06/56] Adding app/View/Components/Layout.php --- app/View/Components/Layout.php | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 app/View/Components/Layout.php diff --git a/app/View/Components/Layout.php b/app/View/Components/Layout.php new file mode 100644 index 0000000..955ece4 --- /dev/null +++ b/app/View/Components/Layout.php @@ -0,0 +1,28 @@ +name = $name; + } + + public function render() + { + return view("layouts.{$this->name}"); + } +} From 7712a4aad29ceb315e767aa3ea52e65c6293661d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 16:35:47 +0100 Subject: [PATCH 07/56] Adding resources/views/components/notification.blade.php --- .../views/components/notification.blade.php | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 resources/views/components/notification.blade.php diff --git a/resources/views/components/notification.blade.php b/resources/views/components/notification.blade.php new file mode 100644 index 0000000..d5d6da7 --- /dev/null +++ b/resources/views/components/notification.blade.php @@ -0,0 +1,27 @@ +@props(['variant' => 'info', 'delay' => 2000]) +@php + +switch($variant) { +case 'success': + $variant_classes = 'text-green-800 bg-green-200 border-green-300'; + break; +case 'warning': + $variant_classes = 'text-yellow-800 bg-yellow-200 border-yellow-300'; + break; +case 'danger': + $variant_classes = 'text-red-800 bg-red-200 border-red-300'; + break; +case 'info': +default: + $variant_classes = 'text-blue-800 bg-blue-200 border-blue-300'; +} + +@endphp + +
merge(['class' => "w-full px-4 py-2 rounded border $variant_classes"]) !!}> + + {{ $slot }} +
From fa002d5e0823a321644ca4a9ca7ddb33eca580a9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 16:41:11 +0100 Subject: [PATCH 08/56] Adding AlertContainer Livewire component. --- app/Http/Livewire/AlertContainer.php | 58 +++++++++++++++++++ .../views/livewire/alert-container.blade.php | 5 ++ 2 files changed, 63 insertions(+) create mode 100644 app/Http/Livewire/AlertContainer.php create mode 100644 resources/views/livewire/alert-container.blade.php diff --git a/app/Http/Livewire/AlertContainer.php b/app/Http/Livewire/AlertContainer.php new file mode 100644 index 0000000..310aeb2 --- /dev/null +++ b/app/Http/Livewire/AlertContainer.php @@ -0,0 +1,58 @@ + 'addMessage' + ]; + + /** + * Alert messages. + */ + public array $messages = []; + + public function mount() + { + // Load messages from session + foreach($this->_types as $type) { + if (Session::has($type)) { + $this->addMessage($type, Session::get($type)); + } + } + } + + /** + * Add a message to the container. + */ + public function addMessage(string $type, string $message) + { + $this->messages[] = [ $type, $message ]; + } + + /** + * Render the messages + */ + public function render() + { + return view('livewire.alert-container'); + } +} diff --git a/resources/views/livewire/alert-container.blade.php b/resources/views/livewire/alert-container.blade.php new file mode 100644 index 0000000..dc6726e --- /dev/null +++ b/resources/views/livewire/alert-container.blade.php @@ -0,0 +1,5 @@ +
+ @foreach($messages as $message) + {{ $message[1] }} + @endforeach +
From 90210225d7e2213d5f615c6d2ada696f0c1a2db6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 16:43:04 +0100 Subject: [PATCH 09/56] Adding app/Http/Livewire/Traits/Alert.php --- app/Http/Livewire/Traits/Alert.php | 46 ++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 app/Http/Livewire/Traits/Alert.php diff --git a/app/Http/Livewire/Traits/Alert.php b/app/Http/Livewire/Traits/Alert.php new file mode 100644 index 0000000..125aa22 --- /dev/null +++ b/app/Http/Livewire/Traits/Alert.php @@ -0,0 +1,46 @@ +alert('info', $message); + } + + /** + * Add an success alert + */ + public function success($message) + { + $this->alert('success', $message); + } + + /** + * Add an warning alert + */ + public function warning($message) + { + $this->alert('warning', $message); + } + + /** + * Add an danger alert + */ + public function danger($message) + { + $this->alert('danger', $message); + } + + /** + * Add an alert + */ + public function alert($type, $message) + { + $this->emit('alert', $type, $message); + } +} From 65beeb1487ce36865ccec472fdc489844689c18c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 16:53:05 +0100 Subject: [PATCH 10/56] resources/views/components/button.blade.php: bit of a hack, but add "element" prop and when it's "input" switch type to submit. --- resources/views/components/button.blade.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/views/components/button.blade.php b/resources/views/components/button.blade.php index a6f159b..3c2b58f 100644 --- a/resources/views/components/button.blade.php +++ b/resources/views/components/button.blade.php @@ -1,4 +1,4 @@ -@props(['href' => false, 'type' => 'default']) +@props(['href' => false, 'type' => 'default', 'element' => false]) @php @@ -22,6 +22,8 @@ default: if ($href) { $element = 'a'; $attributes = $attributes->merge([ 'href' => $href ]); +} else if ($element == 'input') { + $attributes = $attributes->merge([ 'type' => 'submit' ]); } else { $element = 'button'; } From 661d1442e79c46c5bd56d525c7401397598dfae4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 16:55:56 +0100 Subject: [PATCH 11/56] Adding app/Models/Admin.php --- app/Models/Admin.php | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 app/Models/Admin.php diff --git a/app/Models/Admin.php b/app/Models/Admin.php new file mode 100644 index 0000000..85a0b73 --- /dev/null +++ b/app/Models/Admin.php @@ -0,0 +1,31 @@ + Date: Fri, 31 Dec 2021 16:57:31 +0100 Subject: [PATCH 12/56] config/auth.php: switch "user" to "admin" --- config/auth.php | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/config/auth.php b/config/auth.php index e29a3f7..40def03 100644 --- a/config/auth.php +++ b/config/auth.php @@ -14,8 +14,8 @@ return [ */ 'defaults' => [ - 'guard' => 'web', - 'passwords' => 'users', + 'guard' => 'admin', + 'passwords' => 'admins', ], /* @@ -36,9 +36,9 @@ return [ */ 'guards' => [ - 'web' => [ + 'admin' => [ 'driver' => 'session', - 'provider' => 'users', + 'provider' => 'admins', ], ], @@ -60,15 +60,10 @@ return [ */ 'providers' => [ - 'users' => [ + 'admins' => [ 'driver' => 'eloquent', - 'model' => App\Models\User::class, + 'model' => App\Models\Admin::class, ], - - // 'users' => [ - // 'driver' => 'database', - // 'table' => 'users', - // ], ], /* @@ -87,8 +82,8 @@ return [ */ 'passwords' => [ - 'users' => [ - 'provider' => 'users', + 'admins' => [ + 'provider' => 'admins', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, From d40008aafc4a25275434e0ce3bb1eb85c486ad13 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:02:37 +0100 Subject: [PATCH 13/56] Adding resources/views/layouts/auth.blade.php --- resources/views/layouts/auth.blade.php | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 resources/views/layouts/auth.blade.php diff --git a/resources/views/layouts/auth.blade.php b/resources/views/layouts/auth.blade.php new file mode 100644 index 0000000..9803195 --- /dev/null +++ b/resources/views/layouts/auth.blade.php @@ -0,0 +1,5 @@ + +
+ {{ $slot }} +
+
From 62b32d36e7ec9b36d5b8505e7bc60977ddf11f9b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:12:40 +0100 Subject: [PATCH 14/56] Adding LoginForm Livewire component --- app/Http/Livewire/Form/LoginForm.php | 43 ++++++++++++++++++++++++++++ resources/views/form/login.blade.php | 17 +++++++++++ 2 files changed, 60 insertions(+) create mode 100644 app/Http/Livewire/Form/LoginForm.php create mode 100644 resources/views/form/login.blade.php diff --git a/app/Http/Livewire/Form/LoginForm.php b/app/Http/Livewire/Form/LoginForm.php new file mode 100644 index 0000000..01568cf --- /dev/null +++ b/app/Http/Livewire/Form/LoginForm.php @@ -0,0 +1,43 @@ + 'required|string|min:3', + 'password' => 'required|string', + ]; + + public function submit() + { + $this->validate(); + + $cred = [ + 'username' => $this->username, + 'password' => $this->password + ]; + + if (!Auth::attempt($cred)) { + session()->flash('message', __('auth.failed')); + return; + } + + return redirect()->intended('/admin'); + } + + /** + * Render the setup page + */ + public function render() + { + return view('form.login'); + } +} diff --git a/resources/views/form/login.blade.php b/resources/views/form/login.blade.php new file mode 100644 index 0000000..136441e --- /dev/null +++ b/resources/views/form/login.blade.php @@ -0,0 +1,17 @@ +
+ @if (Session::has('message')) +

{{ Session::get('message') }}

+ @endif + +
+ Username + +
+ +
+ + +
+ + + From 9992f4a1ed8d032260fc082fcced63189915e580 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:17:28 +0100 Subject: [PATCH 15/56] Adding Auth Controller --- app/Http/Controllers/AuthController.php | 36 +++++++++++++++++++++++++ resources/views/auth/login.blade.php | 3 +++ 2 files changed, 39 insertions(+) create mode 100644 app/Http/Controllers/AuthController.php create mode 100644 resources/views/auth/login.blade.php diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php new file mode 100644 index 0000000..2b0ae3f --- /dev/null +++ b/app/Http/Controllers/AuthController.php @@ -0,0 +1,36 @@ +logout(); + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 0000000..092ee5f --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,3 @@ + + @livewire('form.login-form') + From 014e1bc091530bd387073fb459aa2a9d02946cd8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:19:57 +0100 Subject: [PATCH 16/56] resources/views/layouts/app.blade.php: add "h-full" class to body (so that it's possible to have a full height sidebar). --- resources/views/layouts/app.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 4d8a931..b8138c6 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -8,7 +8,7 @@ @livewireStyles - + {{ $slot }} From f47bf9ca6280831c5b725ac78853cc35eaf3c7e6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:20:26 +0100 Subject: [PATCH 17/56] Adding resources/views/layouts/admin.blade.php --- resources/views/layouts/admin.blade.php | 37 +++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 resources/views/layouts/admin.blade.php diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php new file mode 100644 index 0000000..b768445 --- /dev/null +++ b/resources/views/layouts/admin.blade.php @@ -0,0 +1,37 @@ +@php + $item_classes = "flex items-center inline-block w-full px-4 py-2 rounded-lg hover:bg-blue-800"; +@endphp + + +
+ +
+ + + + + + + + +
+ +
+ {{ $slot }} +
+
+
From 78837efd2dbc604b30f124ed23ed45f16b738f3c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:21:00 +0100 Subject: [PATCH 18/56] Adding Admin Controller --- .../Controllers/Admin/AdminController.php | 15 +++++++++++++ resources/views/admin/admin/index.blade.php | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 app/Http/Controllers/Admin/AdminController.php create mode 100644 resources/views/admin/admin/index.blade.php diff --git a/app/Http/Controllers/Admin/AdminController.php b/app/Http/Controllers/Admin/AdminController.php new file mode 100644 index 0000000..70658cd --- /dev/null +++ b/app/Http/Controllers/Admin/AdminController.php @@ -0,0 +1,15 @@ + Admin::all() ]); + } +} diff --git a/resources/views/admin/admin/index.blade.php b/resources/views/admin/admin/index.blade.php new file mode 100644 index 0000000..b2f1925 --- /dev/null +++ b/resources/views/admin/admin/index.blade.php @@ -0,0 +1,21 @@ + + + + + + + + + + + @foreach($items as $item) + + + + + + @endforeach + +
UsernameCreatedUpdated
{{ $item->username }}{{ $item->created_at }}{{ $item->updated_at }}
+ +
From 13de198571ed121193f1d118f7080cfec6868dda Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:22:42 +0100 Subject: [PATCH 19/56] routes/web.php: Add auth and admin routes. --- routes/web.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/routes/web.php b/routes/web.php index b7b5974..c2d67f0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,6 +5,8 @@ use Illuminate\Support\Facades\Route; use App\Http\Livewire\Game; use App\Http\Livewire\Setup; use App\Http\Controllers\SettingController; +use App\Http\Controllers\AuthController; +use App\Http\Controllers\Admin\AdminController; use Illuminate\Support\Facades\Session; @@ -28,3 +30,17 @@ Route::get('/setup', Setup::class)->name('setup'); route::get('/setup/{setting}', [ SettingController::class, "hash" ])->name('setup-hash'); Route::get('/game', Game::class)->name('game'); + +// Admin section +Route::prefix('admin')->group(function() { + + // Auth + Route::get('/login', [AuthController::class, 'create'])->name('login'); + Route::post('/login', [AuthController::class, 'store']); + + Route::middleware(['auth'])->group(function() { + + Route::get('/', [AdminController::class, 'index']); + Route::post('/logout', [AuthController::class, 'destroy'])->name('logout'); + }); +}); From 6dbeaa5f77c45898d497c992b5e2ab56a57ec2b9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:24:08 +0100 Subject: [PATCH 20/56] Adding app/Http/Middleware/Authenticate.php --- app/Http/Middleware/Authenticate.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 app/Http/Middleware/Authenticate.php diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..704089a --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,21 @@ +expectsJson()) { + return route('login'); + } + } +} From 30933e2711e24f29d4ed7e21e94bea1eccc7f980 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:24:27 +0100 Subject: [PATCH 21/56] app/Http/Kernel.php: Add auth route middleware --- app/Http/Kernel.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 83a7dfb..45f9b58 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -34,4 +34,15 @@ class Kernel extends HttpKernel \Illuminate\View\Middleware\ShareErrorsFromSession::class, ] ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \App\Http\Middleware\Authenticate::class + ]; } From 18adbb4273463239d2c9947fcd35d7d792ecc1dd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 31 Dec 2021 17:24:54 +0100 Subject: [PATCH 22/56] resources/lang/en/auth.php: Update "failed" translation abit. --- resources/lang/en/auth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php index 6598e2c..1cfb622 100644 --- a/resources/lang/en/auth.php +++ b/resources/lang/en/auth.php @@ -13,7 +13,7 @@ return [ | */ - 'failed' => 'These credentials do not match our records.', + 'failed' => 'Invalid username and/or password', 'password' => 'The provided password is incorrect.', 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', From a75c9ddb9981d680b010e53848a9f95b97c6296e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Jan 2022 21:12:55 +0100 Subject: [PATCH 23/56] Adding app/Http/Livewire/Traits/WithSort.php --- app/Http/Livewire/Traits/WithSort.php | 51 +++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 app/Http/Livewire/Traits/WithSort.php diff --git a/app/Http/Livewire/Traits/WithSort.php b/app/Http/Livewire/Traits/WithSort.php new file mode 100644 index 0000000..704b66b --- /dev/null +++ b/app/Http/Livewire/Traits/WithSort.php @@ -0,0 +1,51 @@ +sort_map)) { + return; + } + + if ($this->sort === $column) { + $this->dir = $this->dir === 'asc' ? 'desc' : 'asc'; + } else { + $this->sort = $column; + $this->reset('dir'); + } + } + + protected function sortApply($query) + { + // No sorting. bail out. + if (!strlen($this->sort)) { + return; + } + + $columns = $this->sort_map[$this->sort]; + + if (!is_array($columns)) { + $columns = [ $columns ]; + } + + foreach($columns as $column) { + $query->orderBy($column, $this->dir); + } + } +} From 3762e92989db493a6b59cedd756b108bab860a37 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Jan 2022 21:16:23 +0100 Subject: [PATCH 24/56] Adding config/ignite.php --- config/ignite.php | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 config/ignite.php diff --git a/config/ignite.php b/config/ignite.php new file mode 100644 index 0000000..eda9bd2 --- /dev/null +++ b/config/ignite.php @@ -0,0 +1,9 @@ + [ + 'icon' => 'heroicon-s-chevron-down', + ] + +]; From 65d7f4cdbee6372e7027ac54799796490f737aa5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Jan 2022 21:18:13 +0100 Subject: [PATCH 25/56] app/Models/Card.php: adding getSubjectTypeAttribute() --- app/Models/Card.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/Models/Card.php b/app/Models/Card.php index d2abc26..4d0d542 100644 --- a/app/Models/Card.php +++ b/app/Models/Card.php @@ -57,6 +57,21 @@ class Card extends Model return "Somebody"; } + /** + * Who, Where or What this card belongs to. + */ + public function getSubjectTypeAttribute() + { + if ($this->character) { + return "Character"; + } else if ($this->class) { + return "Class"; + } else if ($this->role) { + return "Roll"; + } + return "Anyone"; + } + /** * Get cards depending on settings. */ From 07de4a54fa9a53104825b4216d58b1625b95a263 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Jan 2022 21:19:12 +0100 Subject: [PATCH 26/56] app/Models/Card.php: Add "subject_type" to appends array. --- app/Models/Card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/Card.php b/app/Models/Card.php index 4d0d542..cc9c37f 100644 --- a/app/Models/Card.php +++ b/app/Models/Card.php @@ -16,7 +16,7 @@ class Card extends Model public $timestamps = false; - protected $appends = ['subject']; + protected $appends = ['subject', 'subject_type']; public $fillable = [ 'body', From 9f16f13a1a2afd02420b0a4c2225fba85ef832c9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Jan 2022 21:31:24 +0100 Subject: [PATCH 27/56] Adding app/Models/Wow.php --- app/Models/Wow.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 app/Models/Wow.php diff --git a/app/Models/Wow.php b/app/Models/Wow.php new file mode 100644 index 0000000..4c3be78 --- /dev/null +++ b/app/Models/Wow.php @@ -0,0 +1,21 @@ + 'Warrior', + 'rogue' => 'Rogue', + 'paladin' => 'Paladin', + 'hunter' => 'Hunter', + 'mage' => 'Mage', + 'warlock' => 'Warlock', + 'shaman' => 'Shaman', + 'druid' => 'Druid', + 'priest' => 'Priest' + ]; +} From decb948f2faca5f552aafbb46e4958a217557862 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 15:18:04 +0100 Subject: [PATCH 28/56] composer.json: install pnx/laravel-ignite from master branch. --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8cc46fe..2056f7b 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "laravel/framework": "^8.54", "laravel/tinker": "^2.5", "livewire/livewire": "^2.5", - "pnx/laravel-ignite": "9999999-dev", + "pnx/laravel-ignite": "dev-master", "vinkla/hashids": "^9.1" }, "require-dev": { From debc32ba1b7eb05baa166b95abdbe78bb5f179c5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 15:20:06 +0100 Subject: [PATCH 29/56] composer: update pnx/laravel-ignite --- composer.lock | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/composer.lock b/composer.lock index c20fe9b..008a4f6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "698201d881ac8e6d8821208ad918f5f6", + "content-hash": "78c4a9878ac3ea63b726daad902f8225", "packages": [ { "name": "asm89/stack-cors", @@ -2479,12 +2479,12 @@ "source": { "type": "git", "url": "https://github.com/pnx/laravel-ignite.git", - "reference": "5d3da73f8e5d73e70c383f7a9d66dfee1774f726" + "reference": "a40324f96ad834321c434cef24a95423b77d14eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pnx/laravel-ignite/zipball/5d3da73f8e5d73e70c383f7a9d66dfee1774f726", - "reference": "5d3da73f8e5d73e70c383f7a9d66dfee1774f726", + "url": "https://api.github.com/repos/pnx/laravel-ignite/zipball/a40324f96ad834321c434cef24a95423b77d14eb", + "reference": "a40324f96ad834321c434cef24a95423b77d14eb", "shasum": "" }, "require": { @@ -2493,6 +2493,9 @@ "require-dev": { "phpunit/phpunit": "^9.3" }, + "suggest": { + "blade-ui-kit/blade-icons": "For adding icons to form elements." + }, "default-branch": true, "type": "library", "extra": { @@ -2517,7 +2520,7 @@ "source": "https://github.com/pnx/laravel-ignite/tree/master", "issues": "https://github.com/pnx/laravel-ignite/issues" }, - "time": "2021-11-14T14:23:03+00:00" + "time": "2022-01-02T12:50:55+00:00" }, { "name": "psr/container", From 93a40df6ec30b8613b3863b3c50f8b7dbde6d67f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:14:14 +0100 Subject: [PATCH 30/56] resources/views/layouts/app.blade.php: Adding @igniteScripts --- resources/views/layouts/app.blade.php | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index b8138c6..d2c9178 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -13,5 +13,6 @@ {{ $slot }} @livewireScripts +@igniteScripts From 5b602b2701396cef8ff8b99d300044a161e5716a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:16:29 +0100 Subject: [PATCH 31/56] resources/views/layouts/app.blade.php: user livewire alert-container component --- resources/views/layouts/app.blade.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index d2c9178..9ef3ea9 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -10,6 +10,8 @@ + + {{ $slot }} @livewireScripts From 152b22c3c6f97d23b9c60cbb2bac02f391947ab2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:17:03 +0100 Subject: [PATCH 32/56] Adding resources/views/components/sort-link.blade.php --- resources/views/components/sort-link.blade.php | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 resources/views/components/sort-link.blade.php diff --git a/resources/views/components/sort-link.blade.php b/resources/views/components/sort-link.blade.php new file mode 100644 index 0000000..ac52fa1 --- /dev/null +++ b/resources/views/components/sort-link.blade.php @@ -0,0 +1,5 @@ +@props(['name', 'column', 'dir']) + +@if ($name === $column) +only('class') }} /> +@endif From 8a460b3debcf77d2b64e39829129aee250fcece8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:32:28 +0100 Subject: [PATCH 33/56] app/Http/Livewire/Traits/WithSort.php: rename sort_map to sort_columns --- app/Http/Livewire/Traits/WithSort.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Livewire/Traits/WithSort.php b/app/Http/Livewire/Traits/WithSort.php index 704b66b..854531c 100644 --- a/app/Http/Livewire/Traits/WithSort.php +++ b/app/Http/Livewire/Traits/WithSort.php @@ -19,7 +19,7 @@ trait WithSort { */ public function sort($column) { - if (!array_key_exists($column, $this->sort_map)) { + if (!array_key_exists($column, $this->sort_columns)) { return; } @@ -38,7 +38,7 @@ trait WithSort { return; } - $columns = $this->sort_map[$this->sort]; + $columns = $this->sort_columns[$this->sort]; if (!is_array($columns)) { $columns = [ $columns ]; From 5359fbcffc00fa3dfc8ce687ccdce521cc5cba59 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:32:50 +0100 Subject: [PATCH 34/56] Adding Datatable livewire component --- app/Http/Livewire/Datatable.php | 93 ++++++++++++++++++++ resources/views/livewire/datatable.blade.php | 57 ++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 app/Http/Livewire/Datatable.php create mode 100644 resources/views/livewire/datatable.blade.php diff --git a/app/Http/Livewire/Datatable.php b/app/Http/Livewire/Datatable.php new file mode 100644 index 0000000..2d2df3c --- /dev/null +++ b/app/Http/Livewire/Datatable.php @@ -0,0 +1,93 @@ + ['except' => 'id'], + 'dir' => ['except' => 'asc'], + 'page' => ['except' => 1] + ]; + + /** + * Model to get data from. + */ + public $model; + + /** + * Array of columns to show + */ + public array $columns; + + /** + * What colums are sortable + */ + public array $sort_columns; + + /** + * Route for editing a record (if null, link is omitted) + */ + public $route_edit; + + /** + * Route for deleting a record (if null, link is omitted) + */ + public $route_delete; + + /** + * How many records should be displayed on one page. + */ + public int $itemsPerPage = 30; + + public function mount(string $model, array $columns, array $sort_columns = [], + $default_sort = '', $route_delete = null, $route_edit = null) + { + $this->model = app()->make($model); + $this->sort = $default_sort; + $this->sort_columns = $sort_columns; + $this->route_edit = $route_edit; + $this->route_delete = $route_delete; + } + + /** + * Render the datatable + */ + public function render() + { + $query = $this->model->query(); + + // Check colums for "dot-notated" strings. + // as we want to eager load those relationships + foreach ($this->columns as $col => $_) { + $p = strrpos($col, '.'); + if ($p !== false) { + $rel = substr($col, 0, $p); + $query->with($rel); + } + } + + // Apply sorting. + $this->sortApply($query); + + $items = $query->paginate($this->itemsPerPage); + + return view('livewire.datatable', ['items' => $items]); + } + + public function getRouteKeyProperty() + { + return Str::slug(get_class($this->model)); + } +} diff --git a/resources/views/livewire/datatable.blade.php b/resources/views/livewire/datatable.blade.php new file mode 100644 index 0000000..8321b61 --- /dev/null +++ b/resources/views/livewire/datatable.blade.php @@ -0,0 +1,57 @@ +
+ + + + + @foreach($columns as $key => $name) + + @endforeach + + @if($route_delete || $route_edit) + + @endif + + + + @foreach($items as $item) + + @foreach(array_keys($columns) as $key) + + @endforeach + + + + @endforeach + +
+ @if (isset($sort_columns[$key])) +
+ {{ __($name) }} + +
+ @else + {{ $name }} + @endif +
{{ __('Actions') }}
{{ Arr::get($item, $key) }} + @if($route_edit) + + + + @endif + + @if($route_delete) + + + + + + @endif +
+ + @if ($items->hasPages()) +
+ {{ $items->links() }} +
+ @endif + +
From 85924ba99eebc81a77a72c57c383d896690680bd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:33:19 +0100 Subject: [PATCH 35/56] Adding resources/views/components/header.blade.php --- resources/views/components/header.blade.php | 1 + 1 file changed, 1 insertion(+) create mode 100644 resources/views/components/header.blade.php diff --git a/resources/views/components/header.blade.php b/resources/views/components/header.blade.php new file mode 100644 index 0000000..77b8820 --- /dev/null +++ b/resources/views/components/header.blade.php @@ -0,0 +1 @@ +

merge(["class" => "text-2xl"]) !!}>{{ $slot }}

From b09bed4a34c8ae1d17a1c1b1789c3cdc3620e86a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:34:45 +0100 Subject: [PATCH 36/56] Adding CardForm livewire component --- app/Http/Livewire/Form/CardForm.php | 104 ++++++++++++++++++++++++++++ resources/views/form/card.blade.php | 32 +++++++++ 2 files changed, 136 insertions(+) create mode 100644 app/Http/Livewire/Form/CardForm.php create mode 100644 resources/views/form/card.blade.php diff --git a/app/Http/Livewire/Form/CardForm.php b/app/Http/Livewire/Form/CardForm.php new file mode 100644 index 0000000..535cbcd --- /dev/null +++ b/app/Http/Livewire/Form/CardForm.php @@ -0,0 +1,104 @@ +card = $card; + $this->characters = Character::all()->pluck('name', 'id'); + $this->raids = Raid::all()->pluck('name', 'id'); + $this->classes = Wow::$classes; + $this->exist = $card->exists; + } + + /** + * Validation rules + */ + protected function rules() + { + return [ + 'card.body' => 'required|string|min:3|max:200', + 'card.character_id' => 'exists:' . Character::class . ',id|nullable', + 'card.raid_id' => 'exists:' . Raid::class . ',id|nullable', + 'card.class' => 'in:' . collect($this->classes)->keys() . '|nullable', + ]; + } + + public function updated($property, $value) + { + // Hack to force empty value to null. + if (in_array($property, ['card.character_id', 'card.raid_id', 'card.class'])) { + if (empty($value)) { + $this->{$property} = null; + } + } + + $this->validateOnly($property); + } + + /** + * Returns true if this card has not been stored in the database. + */ + public function isNew() : bool + { + return !$this->exist; + } + + /** + * Submit the form, create/update card. + */ + public function submit() + { + $this->validate(); + $this->card->save(); + + if ($this->isNew()) { + session()->flash('info', 'Card was successfully created.'); + return redirect()->route('admin.card.index'); + } + + $this->info('Card was successfully updated.'); + } + + /** + * Render the setup page + */ + public function render() + { + return view('form.card') + ->layout('layouts.admin'); + } +} diff --git a/resources/views/form/card.blade.php b/resources/views/form/card.blade.php new file mode 100644 index 0000000..f1ade82 --- /dev/null +++ b/resources/views/form/card.blade.php @@ -0,0 +1,32 @@ + +
+ + {{ __(($this->isNew() ? 'Create' : 'Edit') . ' card') }} + +
+ +
+ {{ __('Body') }} + +
+ +
+
+ {{ __('Raid') }} + +
+
+ {{ __('Character') }} + +
+
+ {{ __('Class') }} + +
+
+ + {{ __('Save') }} + {{ __('Back') }} +
+ +
From 086bd8170249da37fa8f5bea3b424ff83b774f22 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:39:04 +0100 Subject: [PATCH 37/56] Adding card controller for administrators --- app/Http/Controllers/Admin/CardController.php | 22 ++++++++++++++++ resources/views/admin/card/index.blade.php | 25 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 app/Http/Controllers/Admin/CardController.php create mode 100644 resources/views/admin/card/index.blade.php diff --git a/app/Http/Controllers/Admin/CardController.php b/app/Http/Controllers/Admin/CardController.php new file mode 100644 index 0000000..0996aa1 --- /dev/null +++ b/app/Http/Controllers/Admin/CardController.php @@ -0,0 +1,22 @@ +delete(); + + return redirect()->route('admin.card.index'); + } +} diff --git a/resources/views/admin/card/index.blade.php b/resources/views/admin/card/index.blade.php new file mode 100644 index 0000000..e0599b7 --- /dev/null +++ b/resources/views/admin/card/index.blade.php @@ -0,0 +1,25 @@ + + +
+ {{ __('New') }} +
+ + @livewire('datatable', [ + 'model' => \App\Models\Card::class, + 'default_sort' => 'id', + 'route_edit' => 'admin.card.edit', + 'route_delete' => 'admin.card.delete', + 'columns' => [ + 'id' => '#', + 'body' => 'Body', + 'subject' => 'Subject', + 'subject_type' => 'Subject Type', + 'raid.name' => 'Raid', + ], + 'sort_columns' => [ + 'id' => 'id', + 'body' => 'body', + ] + ]) + +
From 3827caf5e47346624db5a92b04c938e4cd486fbd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 16:39:50 +0100 Subject: [PATCH 38/56] routes/web.php: Add admin card routes. --- routes/web.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/routes/web.php b/routes/web.php index c2d67f0..658c896 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,7 +6,10 @@ use App\Http\Livewire\Game; use App\Http\Livewire\Setup; use App\Http\Controllers\SettingController; use App\Http\Controllers\AuthController; + use App\Http\Controllers\Admin\AdminController; +use App\Http\Controllers\Admin\CardController; +use App\Http\Livewire\Form\CardForm; use Illuminate\Support\Facades\Session; @@ -41,6 +44,12 @@ Route::prefix('admin')->group(function() { Route::middleware(['auth'])->group(function() { Route::get('/', [AdminController::class, 'index']); + + Route::get('/cards', [CardController::class, 'index'])->name('admin.card.index'); + Route::get('/cards/new', CardForm::class)->name('admin.card.create'); + Route::get('/cards/{card}', CardForm::class)->name('admin.card.edit'); + Route::delete('/cards/{card}', [CardController::class, 'destroy'])->name('admin.card.delete'); + Route::post('/logout', [AuthController::class, 'destroy'])->name('logout'); }); }); From be39eefd776ef75cffc294022af60fce05fc49e4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 17:02:13 +0100 Subject: [PATCH 39/56] resources/views/layouts/admin.blade.php: Translate menu items. --- resources/views/layouts/admin.blade.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php index b768445..6bb84ca 100644 --- a/resources/views/layouts/admin.blade.php +++ b/resources/views/layouts/admin.blade.php @@ -8,13 +8,13 @@
@@ -22,7 +22,7 @@
  • - Logout + {{ __('Logout') }}
  • From 43f4ac016c47f4fd69ce32b7cb021d88fe880924 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 17:10:58 +0100 Subject: [PATCH 40/56] resources/lang/se.json: Adding more translations --- resources/lang/se.json | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/resources/lang/se.json b/resources/lang/se.json index 78c12fa..4e88a02 100644 --- a/resources/lang/se.json +++ b/resources/lang/se.json @@ -1,6 +1,8 @@ { "Loading": "Laddar", "Save": "Spara", + "New": "Ny", + "Back": "Tillbaka", "Somebody" : "Någon", "Create shareable URL": "Skapa en delbar URL", "Sharable URL": "Delbar URL", @@ -9,12 +11,27 @@ "Clear" : "Rensa", "Go again?" : "Köra igen?", "Game over!" : "Spelet slut!", + "Class": "Klass", "Classes" : "Klasser", + "Character": "Karaktär", "Characters" : "Karaktärer", + "Card": "Kort", + "Cards": "Kort", "singular_somebody" : "Någon", "plurar_somebody" : "Några", "plurar_tank": "Tanken", - "plurar_paladin" : "Paladinen" + "plurar_paladin" : "Paladinen", + + "Actions": "Åtgärd", + + "Edit card": "Ändra kort", + "Create card": "Skapa kort", + + "Select a character": "Välj en karaktär", + "Select a class": "Välj en klass", + "Select a raid": "Välj en raid", + + "Logout": "Logga ut" } From 8a95143b8f34c7da22c25193f57d20a0699857cb Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Jan 2022 17:25:37 +0100 Subject: [PATCH 41/56] Adding se translations for standard laravel components. --- resources/lang/se/auth.php | 18 ++++ resources/lang/se/pagination.php | 17 ++++ resources/lang/se/passwords.php | 20 ++++ resources/lang/se/validation.php | 160 +++++++++++++++++++++++++++++++ 4 files changed, 215 insertions(+) create mode 100644 resources/lang/se/auth.php create mode 100644 resources/lang/se/pagination.php create mode 100644 resources/lang/se/passwords.php create mode 100644 resources/lang/se/validation.php diff --git a/resources/lang/se/auth.php b/resources/lang/se/auth.php new file mode 100644 index 0000000..6c9bae0 --- /dev/null +++ b/resources/lang/se/auth.php @@ -0,0 +1,18 @@ + 'Ogiltigt användarnamn ock/eller lösenord', + 'password' => 'Lösenordet är felaktigt', + 'throttle' => 'För många inloggningsförsök. Var vänlig försök igen om :seconds sekunder.', +]; diff --git a/resources/lang/se/pagination.php b/resources/lang/se/pagination.php new file mode 100644 index 0000000..19b7de8 --- /dev/null +++ b/resources/lang/se/pagination.php @@ -0,0 +1,17 @@ + 'Nästa »', + 'previous' => '« Föregående', +]; diff --git a/resources/lang/se/passwords.php b/resources/lang/se/passwords.php new file mode 100644 index 0000000..08666ac --- /dev/null +++ b/resources/lang/se/passwords.php @@ -0,0 +1,20 @@ + 'Lösenordet har blivit återställt!', + 'sent' => 'Lösenordspåminnelse skickad!', + 'throttled' => 'Vänligen vänta innan du försöker igen.', + 'token' => 'Koden för lösenordsåterställning är ogiltig.', + 'user' => 'Det finns ingen användare med den e-postadressen.', +]; diff --git a/resources/lang/se/validation.php b/resources/lang/se/validation.php new file mode 100644 index 0000000..b5cfee4 --- /dev/null +++ b/resources/lang/se/validation.php @@ -0,0 +1,160 @@ + ':Attribute måste accepteras.', + 'accepted_if' => 'The :attribute must be accepted when :other is :value.', + 'active_url' => ':Attribute är inte en giltig webbadress.', + 'after' => ':Attribute måste vara ett datum efter :date.', + 'after_or_equal' => ':Attribute måste vara ett datum senare eller samma dag som :date.', + 'alpha' => ':Attribute får endast innehålla bokstäver.', + 'alpha_dash' => ':Attribute får endast innehålla bokstäver, siffror och bindestreck.', + 'alpha_num' => ':Attribute får endast innehålla bokstäver och siffror.', + 'array' => ':Attribute måste vara en array.', + 'attached' => 'Denna :attribute är redan bifogad.', + 'before' => ':Attribute måste vara ett datum innan :date.', + 'before_or_equal' => ':Attribute måste vara ett datum före eller samma dag som :date.', + 'between' => [ + 'array' => ':Attribute måste innehålla mellan :min - :max objekt.', + 'file' => ':Attribute måste vara mellan :min till :max kilobyte stor.', + 'numeric' => ':Attribute måste vara en siffra mellan :min och :max.', + 'string' => ':Attribute måste innehålla :min till :max tecken.', + ], + 'boolean' => ':Attribute måste vara sant eller falskt.', + 'confirmed' => ':Attribute bekräftelsen matchar inte.', + 'current_password' => 'The password is incorrect.', + 'date' => ':Attribute är inte ett giltigt datum.', + 'date_equals' => ':Attribute måste vara ett datum lika med :date.', + 'date_format' => ':Attribute matchar inte formatet :format.', + 'declined' => 'The :attribute must be declined.', + 'declined_if' => 'The :attribute must be declined when :other is :value.', + 'different' => ':Attribute och :other får inte vara lika.', + 'digits' => ':Attribute måste vara :digits tecken.', + 'digits_between' => ':Attribute måste vara mellan :min och :max tecken.', + 'dimensions' => ':Attribute har felaktiga bilddimensioner.', + 'distinct' => ':Attribute innehåller fler än en repetition av samma element.', + 'email' => ':Attribute måste innehålla en korrekt e-postadress.', + 'ends_with' => ':Attribute måste sluta med en av följande: :values.', + 'exists' => ':Attribute är ogiltigt.', + 'file' => ':Attribute måste vara en fil.', + 'filled' => ':Attribute är obligatoriskt.', + 'gt' => [ + 'array' => ':Attribute måste innehålla fler än :value objekt.', + 'file' => ':Attribute måste vara större än :value kilobyte stor.', + 'numeric' => ':Attribute måste vara större än :value.', + 'string' => ':Attribute måste vara längre än :value tecken.', + ], + 'gte' => [ + 'array' => ':Attribute måste innehålla lika många eller fler än :value objekt.', + 'file' => ':Attribute måste vara lika med eller större än :value kilobyte stor.', + 'numeric' => ':Attribute måste vara lika med eller större än :value.', + 'string' => ':Attribute måste vara lika med eller längre än :value tecken.', + ], + 'image' => ':Attribute måste vara en bild.', + 'in' => ':Attribute är ogiltigt.', + 'in_array' => ':Attribute finns inte i :other.', + 'integer' => ':Attribute måste vara en siffra.', + 'ip' => ':Attribute måste vara en giltig IP-adress.', + 'ipv4' => ':Attribute måste vara en giltig IPv4-adress.', + 'ipv6' => ':Attribute måste vara en giltig IPv6-adress.', + 'json' => ':Attribute måste vara en giltig JSON-sträng.', + 'lt' => [ + 'array' => ':Attribute måste innehålla färre än :value objekt.', + 'file' => ':Attribute måste vara mindre än :value kilobyte stor.', + 'numeric' => ':Attribute måste vara mindre än :value.', + 'string' => ':Attribute måste vara kortare än :value tecken.', + ], + 'lte' => [ + 'array' => ':Attribute måste innehålla lika många eller färre än :value objekt.', + 'file' => ':Attribute måste vara lika med eller mindre än :value kilobyte stor.', + 'numeric' => ':Attribute måste vara lika med eller mindre än :value.', + 'string' => ':Attribute måste vara lika med eller kortare än :value tecken.', + ], + 'max' => [ + 'array' => ':Attribute får inte innehålla mer än :max objekt.', + 'file' => ':Attribute får max vara :max kilobyte stor.', + 'numeric' => ':Attribute får inte vara större än :max.', + 'string' => ':Attribute får max innehålla :max tecken.', + ], + 'mimes' => ':Attribute måste vara en fil av typen: :values.', + 'mimetypes' => ':Attribute måste vara en fil av typen: :values.', + 'min' => [ + 'array' => ':Attribute måste innehålla minst :min objekt.', + 'file' => ':Attribute måste vara minst :min kilobyte stor.', + 'numeric' => ':Attribute måste vara större än :min.', + 'string' => ':Attribute måste innehålla minst :min tecken.', + ], + 'multiple_of' => ':attribute måste vara en multipel av :value', + 'not_in' => ':Attribute är ogiltigt.', + 'not_regex' => 'Formatet för :attribute är ogiltigt.', + 'numeric' => ':Attribute måste vara en siffra.', + 'password' => 'Lösenordet är fel.', + 'present' => ':Attribute måste finnas med.', + 'prohibited' => 'Fältet :attribute är förbjudet.', + 'prohibited_if' => ':attribute är förbjudet när :other är :value.', + 'prohibited_unless' => ':attribute är förbjudet om inte :other är :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => ':Attribute har ogiltigt format.', + 'relatable' => 'Denna :attribute kanske inte är associerad med den här resursen.', + 'required' => ':Attribute är obligatoriskt.', + 'required_if' => ':Attribute är obligatoriskt när :other är :value.', + 'required_unless' => ':Attribute är obligatoriskt när inte :other finns bland :values.', + 'required_with' => ':Attribute är obligatoriskt när :values är ifyllt.', + 'required_with_all' => ':Attribute är obligatoriskt när :values är ifyllt.', + 'required_without' => ':Attribute är obligatoriskt när :values ej är ifyllt.', + 'required_without_all' => ':Attribute är obligatoriskt när ingen av :values är ifyllt.', + 'same' => ':Attribute och :other måste vara lika.', + 'size' => [ + 'array' => ':Attribute måste innehålla :size objekt.', + 'file' => ':Attribute får endast vara :size kilobyte stor.', + 'numeric' => ':Attribute måste vara :size.', + 'string' => ':Attribute måste innehålla :size tecken.', + ], + 'starts_with' => ':Attribute måste börja med en av följande: :values', + 'string' => ':Attribute måste vara en sträng.', + 'timezone' => ':Attribute måste vara en giltig tidszon.', + 'unique' => ':Attribute används redan.', + 'uploaded' => ':Attribute kunde inte laddas upp.', + 'url' => ':Attribute har ett ogiltigt format.', + 'uuid' => ':Attribute måste vara ett giltigt UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + //'attribute-name' => [ + // 'rule-name' => 'custom-message', + //], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], +]; From 4a7c2dd66cfd2b36aa371ad453d3a07db31ca5ad Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 10:42:06 +0100 Subject: [PATCH 42/56] Adding CharacterForm livewire component --- app/Http/Livewire/Form/CharacterForm.php | 81 ++++++++++++++++++++++++ resources/views/form/character.blade.php | 17 +++++ 2 files changed, 98 insertions(+) create mode 100644 app/Http/Livewire/Form/CharacterForm.php create mode 100644 resources/views/form/character.blade.php diff --git a/app/Http/Livewire/Form/CharacterForm.php b/app/Http/Livewire/Form/CharacterForm.php new file mode 100644 index 0000000..136efa0 --- /dev/null +++ b/app/Http/Livewire/Form/CharacterForm.php @@ -0,0 +1,81 @@ +character = $character; + $this->exist = $character->exists; + } + + /** + * Validation rules + */ + protected function rules() + { + return [ + 'character.name' => 'required|string|min:3|max:14', + ]; + } + + public function updated($property, $value) + { + $this->validateOnly($property); + } + + /** + * Returns true if this card has not been stored in the database. + */ + public function isNew() : bool + { + return !$this->exist; + } + + /** + * Submit the form, create/update card. + */ + public function submit() + { + $this->validate(); + $this->character->save(); + + if ($this->isNew()) { + session()->flash('info', 'Character was successfully created.'); + return redirect()->route('admin.character.index'); + } + + $this->info('Character was successfully updated.'); + } + + /** + * Render the setup page + */ + public function render() + { + return view('form.character') + ->layout('layouts.admin'); + } +} diff --git a/resources/views/form/character.blade.php b/resources/views/form/character.blade.php new file mode 100644 index 0000000..bfbafdc --- /dev/null +++ b/resources/views/form/character.blade.php @@ -0,0 +1,17 @@ + +
    + + {{ __(($this->isNew() ? 'Create' : 'Edit') . ' character') }} + +
    + +
    + {{ __('Name') }} + +
    + + {{ __('Save') }} + {{ __('Back') }} +
    + +
    From 1e624a2f6cd9943caa734ea67a9833d8114c5e42 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 10:42:30 +0100 Subject: [PATCH 43/56] Adding RaidForm livewire component --- app/Http/Livewire/Form/RaidForm.php | 78 +++++++++++++++++++++++++++++ resources/views/form/raid.blade.php | 17 +++++++ 2 files changed, 95 insertions(+) create mode 100644 app/Http/Livewire/Form/RaidForm.php create mode 100644 resources/views/form/raid.blade.php diff --git a/app/Http/Livewire/Form/RaidForm.php b/app/Http/Livewire/Form/RaidForm.php new file mode 100644 index 0000000..92e387b --- /dev/null +++ b/app/Http/Livewire/Form/RaidForm.php @@ -0,0 +1,78 @@ +raid = $raid; + $this->exist = $raid->exists; + } + + /** + * Validation rules + */ + protected function rules() + { + return [ + 'raid.name' => 'required|string|min:2|max:20', + ]; + } + + public function updated($property, $value) + { + $this->validateOnly($property); + } + + /** + * Returns true if this card has not been stored in the database. + */ + public function isNew() : bool + { + return !$this->exist; + } + + /** + * Submit the form, create/update card. + */ + public function submit() + { + $this->validate(); + $this->raid->save(); + + if ($this->isNew()) { + session()->flash('info', 'Raid was successfully created.'); + return redirect()->route('admin.character.index'); + } + + $this->info('Raid was successfully updated.'); + } + + /** + * Render the setup page + */ + public function render() + { + return view('form.raid') + ->layout('layouts.admin'); + } +} diff --git a/resources/views/form/raid.blade.php b/resources/views/form/raid.blade.php new file mode 100644 index 0000000..9a21bdd --- /dev/null +++ b/resources/views/form/raid.blade.php @@ -0,0 +1,17 @@ + +
    + + {{ __(($this->isNew() ? 'Create' : 'Edit') . ' raid') }} + +
    + +
    + {{ __('Name') }} + +
    + + {{ __('Save') }} + {{ __('Back') }} +
    + +
    From b1552483214a8319662e4563452681e006bc3426 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 10:44:15 +0100 Subject: [PATCH 44/56] Adding character controller for administrators --- .../Controllers/Admin/CharacterController.php | 22 +++++++++++++++++++ .../views/admin/character/index.blade.php | 22 +++++++++++++++++++ routes/web.php | 7 ++++++ 3 files changed, 51 insertions(+) create mode 100644 app/Http/Controllers/Admin/CharacterController.php create mode 100644 resources/views/admin/character/index.blade.php diff --git a/app/Http/Controllers/Admin/CharacterController.php b/app/Http/Controllers/Admin/CharacterController.php new file mode 100644 index 0000000..868394a --- /dev/null +++ b/app/Http/Controllers/Admin/CharacterController.php @@ -0,0 +1,22 @@ +delete(); + + return redirect()->route('admin.character.index'); + } +} diff --git a/resources/views/admin/character/index.blade.php b/resources/views/admin/character/index.blade.php new file mode 100644 index 0000000..a82bf7e --- /dev/null +++ b/resources/views/admin/character/index.blade.php @@ -0,0 +1,22 @@ + + +
    + {{ __('New') }} +
    + + @livewire('datatable', [ + 'model' => \App\Models\Character::class, + 'default_sort' => 'id', + 'route_edit' => 'admin.character.edit', + 'route_delete' => 'admin.character.delete', + 'columns' => [ + 'id' => '#', + 'name' => 'Name', + ], + 'sort_columns' => [ + 'id' => 'id', + 'name' => 'name', + ] + ]) + +
    diff --git a/routes/web.php b/routes/web.php index 658c896..edc0da7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,7 +9,9 @@ use App\Http\Controllers\AuthController; use App\Http\Controllers\Admin\AdminController; use App\Http\Controllers\Admin\CardController; +use App\Http\Controllers\Admin\CharacterController; use App\Http\Livewire\Form\CardForm; +use App\Http\Livewire\Form\CharacterForm; use Illuminate\Support\Facades\Session; @@ -50,6 +52,11 @@ Route::prefix('admin')->group(function() { Route::get('/cards/{card}', CardForm::class)->name('admin.card.edit'); Route::delete('/cards/{card}', [CardController::class, 'destroy'])->name('admin.card.delete'); + Route::get('/characters', [CharacterController::class, 'index'])->name('admin.character.index'); + Route::get('/characters/new', CharacterForm::class)->name('admin.character.create'); + Route::get('/characters/{character}', CharacterForm::class)->name('admin.character.edit'); + Route::delete('/characters/{character}', [CharacterController::class, 'destroy'])->name('admin.character.delete'); + Route::post('/logout', [AuthController::class, 'destroy'])->name('logout'); }); }); From 9f147821b3e2946bf8b405b8e77ac83806e0a9d0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 10:44:49 +0100 Subject: [PATCH 45/56] Adding raid controller for administrators --- app/Http/Controllers/Admin/RaidController.php | 22 +++++++++++++++++++ resources/views/admin/raid/index.blade.php | 22 +++++++++++++++++++ routes/web.php | 7 ++++++ 3 files changed, 51 insertions(+) create mode 100644 app/Http/Controllers/Admin/RaidController.php create mode 100644 resources/views/admin/raid/index.blade.php diff --git a/app/Http/Controllers/Admin/RaidController.php b/app/Http/Controllers/Admin/RaidController.php new file mode 100644 index 0000000..439062f --- /dev/null +++ b/app/Http/Controllers/Admin/RaidController.php @@ -0,0 +1,22 @@ +delete(); + + return redirect()->route('admin.raid.index'); + } +} diff --git a/resources/views/admin/raid/index.blade.php b/resources/views/admin/raid/index.blade.php new file mode 100644 index 0000000..d0c7c5f --- /dev/null +++ b/resources/views/admin/raid/index.blade.php @@ -0,0 +1,22 @@ + + +
    + {{ __('New') }} +
    + + @livewire('datatable', [ + 'model' => \App\Models\Raid::class, + 'default_sort' => 'id', + 'route_edit' => 'admin.raid.edit', + 'route_delete' => 'admin.raid.delete', + 'columns' => [ + 'id' => '#', + 'name' => 'Name', + ], + 'sort_columns' => [ + 'id' => 'id', + 'name' => 'name', + ] + ]) + +
    diff --git a/routes/web.php b/routes/web.php index edc0da7..d0f6487 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,8 +10,10 @@ use App\Http\Controllers\AuthController; use App\Http\Controllers\Admin\AdminController; use App\Http\Controllers\Admin\CardController; use App\Http\Controllers\Admin\CharacterController; +use App\Http\Controllers\Admin\RaidController; use App\Http\Livewire\Form\CardForm; use App\Http\Livewire\Form\CharacterForm; +use App\Http\Livewire\Form\RaidForm; use Illuminate\Support\Facades\Session; @@ -57,6 +59,11 @@ Route::prefix('admin')->group(function() { Route::get('/characters/{character}', CharacterForm::class)->name('admin.character.edit'); Route::delete('/characters/{character}', [CharacterController::class, 'destroy'])->name('admin.character.delete'); + Route::get('/raids', [RaidController::class, 'index'])->name('admin.raid.index'); + Route::get('/raids/new', RaidForm::class)->name('admin.raid.create'); + Route::get('/raids/{raid}', RaidForm::class)->name('admin.raid.edit'); + Route::delete('/raids/{raid}', [RaidController::class, 'destroy'])->name('admin.raid.delete'); + Route::post('/logout', [AuthController::class, 'destroy'])->name('logout'); }); }); From 5f960cf3d9ad1ae02a7175934a534cb25620ac58 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 11:10:34 +0100 Subject: [PATCH 46/56] Adding app/Http/Livewire/Form/ModelForm.php --- app/Http/Livewire/Form/ModelForm.php | 76 ++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 app/Http/Livewire/Form/ModelForm.php diff --git a/app/Http/Livewire/Form/ModelForm.php b/app/Http/Livewire/Form/ModelForm.php new file mode 100644 index 0000000..491e235 --- /dev/null +++ b/app/Http/Livewire/Form/ModelForm.php @@ -0,0 +1,76 @@ +record), '\\'); + } + + public function updated($property, $value) + { + $this->validateOnly($property); + } + + /** + * Returns true if this record has not been stored in the database. + */ + public function isNew() : bool + { + return !$this->exist; + } + + /** + * Submit the form, create/update record. + */ + public function submit() + { + $this->validate(); + $this->record->save(); + + if ($this->isNew()) { + session()->flash('info', "{$this->getModelName()} was successfully created."); + return redirect()->route($this->redirect_route); + } + + $this->info("{$this->getModelName()} was successfully updated."); + } + + /** + * Render the setup page + */ + public function render() + { + $script = Str::lower($this->getModelName()); + + return view("form.$script") + ->layout('layouts.admin'); + } +} From 40b73e1c5c5109554a4c68cbc0300cd0d3283932 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 11:11:58 +0100 Subject: [PATCH 47/56] app/Http/Livewire/Form/*: extend ModelForm to share ALOT of code and make concrete form classes smaller --- app/Http/Livewire/Form/CardForm.php | 62 ++++-------------------- app/Http/Livewire/Form/CharacterForm.php | 62 ++---------------------- app/Http/Livewire/Form/RaidForm.php | 59 ++-------------------- resources/views/form/card.blade.php | 16 +++--- resources/views/form/character.blade.php | 4 +- resources/views/form/raid.blade.php | 4 +- 6 files changed, 31 insertions(+), 176 deletions(-) diff --git a/app/Http/Livewire/Form/CardForm.php b/app/Http/Livewire/Form/CardForm.php index 535cbcd..186db8d 100644 --- a/app/Http/Livewire/Form/CardForm.php +++ b/app/Http/Livewire/Form/CardForm.php @@ -7,19 +7,8 @@ use App\Models\Character; use App\Models\Raid; use App\Models\Wow; -use App\Http\Livewire\Traits\Alert; - -use Livewire\Component; - -class CardForm extends Component +class CardForm extends ModelForm { - use Alert; - - /** - * The card record - */ - public $card; - /** * Array of available characters */ @@ -31,13 +20,13 @@ class CardForm extends Component public $raids; /** - * True if the record already exists in the database. + * Redirect after this route after record was created. */ - public bool $exist; + public string $redirect_route = 'admin.card.index'; public function mount(Card $card) { - $this->card = $card; + $this->record = $card; $this->characters = Character::all()->pluck('name', 'id'); $this->raids = Raid::all()->pluck('name', 'id'); $this->classes = Wow::$classes; @@ -50,17 +39,17 @@ class CardForm extends Component protected function rules() { return [ - 'card.body' => 'required|string|min:3|max:200', - 'card.character_id' => 'exists:' . Character::class . ',id|nullable', - 'card.raid_id' => 'exists:' . Raid::class . ',id|nullable', - 'card.class' => 'in:' . collect($this->classes)->keys() . '|nullable', + 'record.body' => 'required|string|min:3|max:200', + 'record.character_id' => 'exists:' . Character::class . ',id|nullable', + 'record.raid_id' => 'exists:' . Raid::class . ',id|nullable', + 'record.class' => 'in:' . collect($this->classes)->keys() . '|nullable', ]; } public function updated($property, $value) { // Hack to force empty value to null. - if (in_array($property, ['card.character_id', 'card.raid_id', 'card.class'])) { + if (in_array($property, ['record.character_id', 'record.raid_id', 'record.class'])) { if (empty($value)) { $this->{$property} = null; } @@ -68,37 +57,4 @@ class CardForm extends Component $this->validateOnly($property); } - - /** - * Returns true if this card has not been stored in the database. - */ - public function isNew() : bool - { - return !$this->exist; - } - - /** - * Submit the form, create/update card. - */ - public function submit() - { - $this->validate(); - $this->card->save(); - - if ($this->isNew()) { - session()->flash('info', 'Card was successfully created.'); - return redirect()->route('admin.card.index'); - } - - $this->info('Card was successfully updated.'); - } - - /** - * Render the setup page - */ - public function render() - { - return view('form.card') - ->layout('layouts.admin'); - } } diff --git a/app/Http/Livewire/Form/CharacterForm.php b/app/Http/Livewire/Form/CharacterForm.php index 136efa0..8358107 100644 --- a/app/Http/Livewire/Form/CharacterForm.php +++ b/app/Http/Livewire/Form/CharacterForm.php @@ -2,32 +2,18 @@ namespace App\Http\Livewire\Form; -use App\Models\Card; use App\Models\Character; -use App\Models\Raid; -use App\Models\Wow; -use App\Http\Livewire\Traits\Alert; - -use Livewire\Component; - -class CharacterForm extends Component +class CharacterForm extends ModelForm { - use Alert; - /** - * The character record + * Redirect after this route after record was created. */ - public $character; - - /** - * True if the record already exists in the database. - */ - public bool $exist; + public string $redirect_route = 'admin.character.index'; public function mount(Character $character) { - $this->character = $character; + $this->record = $character; $this->exist = $character->exists; } @@ -37,45 +23,7 @@ class CharacterForm extends Component protected function rules() { return [ - 'character.name' => 'required|string|min:3|max:14', + 'record.name' => 'required|string|min:3|max:14', ]; } - - public function updated($property, $value) - { - $this->validateOnly($property); - } - - /** - * Returns true if this card has not been stored in the database. - */ - public function isNew() : bool - { - return !$this->exist; - } - - /** - * Submit the form, create/update card. - */ - public function submit() - { - $this->validate(); - $this->character->save(); - - if ($this->isNew()) { - session()->flash('info', 'Character was successfully created.'); - return redirect()->route('admin.character.index'); - } - - $this->info('Character was successfully updated.'); - } - - /** - * Render the setup page - */ - public function render() - { - return view('form.character') - ->layout('layouts.admin'); - } } diff --git a/app/Http/Livewire/Form/RaidForm.php b/app/Http/Livewire/Form/RaidForm.php index 92e387b..831e2dc 100644 --- a/app/Http/Livewire/Form/RaidForm.php +++ b/app/Http/Livewire/Form/RaidForm.php @@ -4,27 +4,16 @@ namespace App\Http\Livewire\Form; use App\Models\Raid; -use App\Http\Livewire\Traits\Alert; - -use Livewire\Component; - -class RaidForm extends Component +class RaidForm extends ModelForm { - use Alert; - /** - * The raid record + * Redirect after this route after record was created. */ - public $raid; - - /** - * True if the record already exists in the database. - */ - public bool $exist; + public string $redirect_route = 'admin.raid.index'; public function mount(Raid $raid) { - $this->raid = $raid; + $this->record = $raid; $this->exist = $raid->exists; } @@ -34,45 +23,7 @@ class RaidForm extends Component protected function rules() { return [ - 'raid.name' => 'required|string|min:2|max:20', + 'record.name' => 'required|string|min:2|max:20', ]; } - - public function updated($property, $value) - { - $this->validateOnly($property); - } - - /** - * Returns true if this card has not been stored in the database. - */ - public function isNew() : bool - { - return !$this->exist; - } - - /** - * Submit the form, create/update card. - */ - public function submit() - { - $this->validate(); - $this->raid->save(); - - if ($this->isNew()) { - session()->flash('info', 'Raid was successfully created.'); - return redirect()->route('admin.character.index'); - } - - $this->info('Raid was successfully updated.'); - } - - /** - * Render the setup page - */ - public function render() - { - return view('form.raid') - ->layout('layouts.admin'); - } } diff --git a/resources/views/form/card.blade.php b/resources/views/form/card.blade.php index f1ade82..c53df83 100644 --- a/resources/views/form/card.blade.php +++ b/resources/views/form/card.blade.php @@ -6,22 +6,22 @@
    - {{ __('Body') }} - + {{ __('Body') }} +
    - {{ __('Raid') }} - + {{ __('Raid') }} +
    - {{ __('Character') }} - + {{ __('Character') }} +
    - {{ __('Class') }} - + {{ __('Class') }} +
    diff --git a/resources/views/form/character.blade.php b/resources/views/form/character.blade.php index bfbafdc..ba79495 100644 --- a/resources/views/form/character.blade.php +++ b/resources/views/form/character.blade.php @@ -6,8 +6,8 @@
    - {{ __('Name') }} - + {{ __('Name') }} +
    {{ __('Save') }} diff --git a/resources/views/form/raid.blade.php b/resources/views/form/raid.blade.php index 9a21bdd..f09b4ee 100644 --- a/resources/views/form/raid.blade.php +++ b/resources/views/form/raid.blade.php @@ -6,8 +6,8 @@
    - {{ __('Name') }} - + {{ __('Name') }} +
    {{ __('Save') }} From 436c0a1651342ecc30b9064e32f82a57538e8b6d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 11:28:22 +0100 Subject: [PATCH 48/56] app/Http/Controllers/Admin/*: Add static method getForm() that will return the livewire component class. This makes routing abit simpler as one only needs to import the controller. --- app/Http/Controllers/Admin/CardController.php | 10 ++++++++-- .../Controllers/Admin/CharacterController.php | 6 ++++++ app/Http/Controllers/Admin/RaidController.php | 6 ++++++ routes/web.php | 15 ++++++--------- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/Admin/CardController.php b/app/Http/Controllers/Admin/CardController.php index 0996aa1..e180e94 100644 --- a/app/Http/Controllers/Admin/CardController.php +++ b/app/Http/Controllers/Admin/CardController.php @@ -3,14 +3,20 @@ namespace App\Http\Controllers\Admin; use App\Models\Card; +use App\Http\Livewire\Form\CardForm; use App\Http\Controllers\Controller; class CardController extends Controller { - public function index() + static public function getForm() : string { - return view("admin.card.index"); + return CardForm::class; + } + + public function index() + { + return view('admin.card.index'); } public function destroy(Card $card) diff --git a/app/Http/Controllers/Admin/CharacterController.php b/app/Http/Controllers/Admin/CharacterController.php index 868394a..503c6e7 100644 --- a/app/Http/Controllers/Admin/CharacterController.php +++ b/app/Http/Controllers/Admin/CharacterController.php @@ -3,11 +3,17 @@ namespace App\Http\Controllers\Admin; use App\Models\Character; +use App\Http\Livewire\Form\CharacterForm; use App\Http\Controllers\Controller; class CharacterController extends Controller { + static public function getForm() : string + { + return CharacterForm::class; + } + public function index() { return view("admin.character.index"); diff --git a/app/Http/Controllers/Admin/RaidController.php b/app/Http/Controllers/Admin/RaidController.php index 439062f..3390830 100644 --- a/app/Http/Controllers/Admin/RaidController.php +++ b/app/Http/Controllers/Admin/RaidController.php @@ -3,11 +3,17 @@ namespace App\Http\Controllers\Admin; use App\Models\Raid; +use App\Http\Livewire\Form\RaidForm; use App\Http\Controllers\Controller; class RaidController extends Controller { + static public function getForm() : string + { + return RaidForm::class; + } + public function index() { return view("admin.raid.index"); diff --git a/routes/web.php b/routes/web.php index d0f6487..a15ca45 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,9 +11,6 @@ use App\Http\Controllers\Admin\AdminController; use App\Http\Controllers\Admin\CardController; use App\Http\Controllers\Admin\CharacterController; use App\Http\Controllers\Admin\RaidController; -use App\Http\Livewire\Form\CardForm; -use App\Http\Livewire\Form\CharacterForm; -use App\Http\Livewire\Form\RaidForm; use Illuminate\Support\Facades\Session; @@ -50,18 +47,18 @@ Route::prefix('admin')->group(function() { Route::get('/', [AdminController::class, 'index']); Route::get('/cards', [CardController::class, 'index'])->name('admin.card.index'); - Route::get('/cards/new', CardForm::class)->name('admin.card.create'); - Route::get('/cards/{card}', CardForm::class)->name('admin.card.edit'); + Route::get('/cards/new', CardController::getForm())->name('admin.card.create'); + Route::get('/cards/{card}', CardController::getForm())->name('admin.card.edit'); Route::delete('/cards/{card}', [CardController::class, 'destroy'])->name('admin.card.delete'); Route::get('/characters', [CharacterController::class, 'index'])->name('admin.character.index'); - Route::get('/characters/new', CharacterForm::class)->name('admin.character.create'); - Route::get('/characters/{character}', CharacterForm::class)->name('admin.character.edit'); + Route::get('/characters/new', CharacterController::getForm())->name('admin.character.create'); + Route::get('/characters/{character}', CharacterController::getForm())->name('admin.character.edit'); Route::delete('/characters/{character}', [CharacterController::class, 'destroy'])->name('admin.character.delete'); Route::get('/raids', [RaidController::class, 'index'])->name('admin.raid.index'); - Route::get('/raids/new', RaidForm::class)->name('admin.raid.create'); - Route::get('/raids/{raid}', RaidForm::class)->name('admin.raid.edit'); + Route::get('/raids/new', RaidController::getForm())->name('admin.raid.create'); + Route::get('/raids/{raid}', RaidController::getForm())->name('admin.raid.edit'); Route::delete('/raids/{raid}', [RaidController::class, 'destroy'])->name('admin.raid.delete'); Route::post('/logout', [AuthController::class, 'destroy'])->name('logout'); From 4b86674ac7997f6d8c5c32dcfbfbe8959f44ae50 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 11:31:01 +0100 Subject: [PATCH 49/56] app/Http/Livewire/Form/ModelForm.php: use redirect()->with() helper instead of session()->flash() --- app/Http/Livewire/Form/ModelForm.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Livewire/Form/ModelForm.php b/app/Http/Livewire/Form/ModelForm.php index 491e235..afa9db8 100644 --- a/app/Http/Livewire/Form/ModelForm.php +++ b/app/Http/Livewire/Form/ModelForm.php @@ -56,8 +56,8 @@ abstract class ModelForm extends Component $this->record->save(); if ($this->isNew()) { - session()->flash('info', "{$this->getModelName()} was successfully created."); - return redirect()->route($this->redirect_route); + return redirect()->route($this->redirect_route) + ->with('info', "{$this->getModelName()} was successfully created."); } $this->info("{$this->getModelName()} was successfully updated."); From 64bfcc71e189b7965729133e81533eaa67830031 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 11:39:37 +0100 Subject: [PATCH 50/56] app/Http/Livewire/Form/ModelForm.php: Translate flash messages. --- app/Http/Livewire/Form/ModelForm.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Livewire/Form/ModelForm.php b/app/Http/Livewire/Form/ModelForm.php index afa9db8..a44d7c9 100644 --- a/app/Http/Livewire/Form/ModelForm.php +++ b/app/Http/Livewire/Form/ModelForm.php @@ -57,10 +57,10 @@ abstract class ModelForm extends Component if ($this->isNew()) { return redirect()->route($this->redirect_route) - ->with('info', "{$this->getModelName()} was successfully created."); + ->with('info', __("{$this->getModelName()} was successfully created.")); } - $this->info("{$this->getModelName()} was successfully updated."); + $this->info(__("{$this->getModelName()} was successfully updated.")); } /** From 058da687537c7e2113cd5de43846257229d365ce Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 11:49:50 +0100 Subject: [PATCH 51/56] app/Http/Controllers/Admin/*: Add flash message to destroy() redirect. --- app/Http/Controllers/Admin/CardController.php | 3 ++- app/Http/Controllers/Admin/CharacterController.php | 3 ++- app/Http/Controllers/Admin/RaidController.php | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Admin/CardController.php b/app/Http/Controllers/Admin/CardController.php index e180e94..2da3ade 100644 --- a/app/Http/Controllers/Admin/CardController.php +++ b/app/Http/Controllers/Admin/CardController.php @@ -23,6 +23,7 @@ class CardController extends Controller { $card->delete(); - return redirect()->route('admin.card.index'); + return redirect()->route('admin.card.index') + ->with('info', __("Card #:id was deleted.", [ 'id' => $card->id ])); } } diff --git a/app/Http/Controllers/Admin/CharacterController.php b/app/Http/Controllers/Admin/CharacterController.php index 503c6e7..93c2692 100644 --- a/app/Http/Controllers/Admin/CharacterController.php +++ b/app/Http/Controllers/Admin/CharacterController.php @@ -23,6 +23,7 @@ class CharacterController extends Controller { $character->delete(); - return redirect()->route('admin.character.index'); + return redirect()->route('admin.character.index') + ->with('info', __("Character #:id was deleted.", [ 'id' => $character->id ])); } } diff --git a/app/Http/Controllers/Admin/RaidController.php b/app/Http/Controllers/Admin/RaidController.php index 3390830..92261a2 100644 --- a/app/Http/Controllers/Admin/RaidController.php +++ b/app/Http/Controllers/Admin/RaidController.php @@ -23,6 +23,7 @@ class RaidController extends Controller { $raid->delete(); - return redirect()->route('admin.raid.index'); + return redirect()->route('admin.raid.index') + ->with('info', __("Raid #:id was deleted.", [ 'id' => $raid->id ])); } } From 3dfbae179eef192d3b1ea3f9d4a9aee6b33232ce Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 11:50:26 +0100 Subject: [PATCH 52/56] resources/lang/se.json: adding more translation keys. --- resources/lang/se.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/resources/lang/se.json b/resources/lang/se.json index 4e88a02..3f860a3 100644 --- a/resources/lang/se.json +++ b/resources/lang/se.json @@ -1,4 +1,5 @@ { + "Name": "Namn", "Loading": "Laddar", "Save": "Spara", "New": "Ny", @@ -26,8 +27,23 @@ "Actions": "Åtgärd", - "Edit card": "Ändra kort", "Create card": "Skapa kort", + "Edit card": "Ändra kort", + "Card was successfully created.": "Kortet har lagts till.", + "Card was successfully updated.": "Kortet har uppdaterats.", + "Card #:id was deleted.": "Kort #:id togs bort.", + + "Create character": "Skapa karaktär", + "Edit character": "Ändra karaktär", + "Character was successfully created.": "Karaktären har lagts till.", + "Character was successfully updated.": "Karaktären har uppdaterats.", + "Character #:id was deleted.": "Karaktär #:id togs bort.", + + "Create raid": "Skapa raid", + "Edit raid": "Ändra raid", + "Raid was successfully created.": "Raiden har lagts till.", + "Raid was successfully updated.": "Raiden har uppdaterats.", + "Raid #:id was deleted.": "Raid #:id togs bort.", "Select a character": "Välj en karaktär", "Select a class": "Välj en klass", From a9ca7cc86a70ec0cb77158a1485151da08b88026 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 11:55:46 +0100 Subject: [PATCH 53/56] resources/views/livewire/datatable.blade.php: only show action column if $route_edit or $route_delete is defined. --- resources/views/livewire/datatable.blade.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/views/livewire/datatable.blade.php b/resources/views/livewire/datatable.blade.php index 8321b61..9f2df23 100644 --- a/resources/views/livewire/datatable.blade.php +++ b/resources/views/livewire/datatable.blade.php @@ -28,6 +28,7 @@ {{ Arr::get($item, $key) }} @endforeach + @if ($route_edit || $route_delete) @if($route_edit) @@ -43,6 +44,7 @@ @endif + @endif @endforeach From 73e49332cd62f94d892409acafb8efa2e310e175 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 12:15:27 +0100 Subject: [PATCH 54/56] resources/views/livewire/datatable.blade.php: Change odd background color abit. --- resources/views/livewire/datatable.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/livewire/datatable.blade.php b/resources/views/livewire/datatable.blade.php index 9f2df23..db46489 100644 --- a/resources/views/livewire/datatable.blade.php +++ b/resources/views/livewire/datatable.blade.php @@ -23,7 +23,7 @@ @foreach($items as $item) - + @foreach(array_keys($columns) as $key) {{ Arr::get($item, $key) }} @endforeach From b2e7bae463237d3167cef8fc098d59e940286db4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 12:16:35 +0100 Subject: [PATCH 55/56] resources/views/admin/admin/index.blade.php: use datatable component. --- resources/views/admin/admin/index.blade.php | 33 ++++++++++----------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/resources/views/admin/admin/index.blade.php b/resources/views/admin/admin/index.blade.php index b2f1925..7dc6439 100644 --- a/resources/views/admin/admin/index.blade.php +++ b/resources/views/admin/admin/index.blade.php @@ -1,21 +1,20 @@ - - - - - - - - - @foreach($items as $item) - - - - - - @endforeach - -
    UsernameCreatedUpdated
    {{ $item->username }}{{ $item->created_at }}{{ $item->updated_at }}
    + @livewire('datatable', [ + 'model' => \App\Models\Admin::class, + 'default_sort' => 'id', + 'columns' => [ + 'id' => '#', + 'username' => 'Username', + 'created_at' => 'Created', + 'updated_at' => 'Updated', + ], + 'sort_columns' => [ + 'id' => 'id', + 'username' => 'username', + 'created_at' => 'created_at', + 'updated_at' => 'updated_at' + ] + ])
    From d0abad8703ce7e86dae253c7019c7ded9890fc85 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 9 Jan 2022 12:17:27 +0100 Subject: [PATCH 56/56] app/Http/Controllers/Admin/AdminController.php: in index() no need to pass model data as we use livewire datatable component. --- app/Http/Controllers/Admin/AdminController.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/Http/Controllers/Admin/AdminController.php b/app/Http/Controllers/Admin/AdminController.php index 70658cd..ed69827 100644 --- a/app/Http/Controllers/Admin/AdminController.php +++ b/app/Http/Controllers/Admin/AdminController.php @@ -2,14 +2,12 @@ namespace App\Http\Controllers\Admin; -use App\Models\Admin; - use App\Http\Controllers\Controller; class AdminController extends Controller { public function index() { - return view("admin.admin.index", [ 'items' => Admin::all() ]); + return view("admin.admin.index"); } }