From b7ce03412253615aa745d8313c5675487a56d133 Mon Sep 17 00:00:00 2001 From: Aji Kamaludin Date: Wed, 14 Jun 2023 21:13:46 +0700 Subject: [PATCH] add default setting --- app/Http/Controllers/UserController.php | 2 +- app/Http/Middleware/HandleInertiaRequests.php | 1 + app/Http/Middleware/HttpSecureAware.php | 2 +- database/seeders/DummySeeder.php | 8 ++- database/seeders/PermissionSeeder.php | 2 + .../Components/Defaults/ApplicationLogo.jsx | 11 ++-- resources/js/Components/FormInput.jsx | 30 ++++++++-- resources/js/Components/Input.jsx | 35 +++++++++--- resources/js/Layouts/Partials/SidebarNav.jsx | 55 ++++++++++--------- resources/js/Layouts/Partials/helpers.js | 14 +++-- resources/js/Layouts/Partials/routes.js | 40 ++++++++------ routes/auth.php | 26 ++++----- 12 files changed, 146 insertions(+), 80 deletions(-) diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 42fff45..6aea49a 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -48,7 +48,7 @@ class UserController extends Controller { $request->validate([ 'name' => 'required|string|max:255', - 'email' => 'required|email|unique:users,email,' . $user->id, + 'email' => 'required|email|unique:users,email,'.$user->id, 'password' => 'nullable|string|max:255', ]); diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 9dc5ef9..0b92957 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -36,6 +36,7 @@ class HandleInertiaRequests extends Middleware 'flash' => [ 'message' => fn () => $request->session()->get('message'), ], + 'app_name' => env('APP_NAME', 'App Name'), ]); } } diff --git a/app/Http/Middleware/HttpSecureAware.php b/app/Http/Middleware/HttpSecureAware.php index dc9acac..dc32d07 100644 --- a/app/Http/Middleware/HttpSecureAware.php +++ b/app/Http/Middleware/HttpSecureAware.php @@ -23,4 +23,4 @@ class HttpSecureAware return $next($request); } -} \ No newline at end of file +} diff --git a/database/seeders/DummySeeder.php b/database/seeders/DummySeeder.php index e237efc..fb70403 100644 --- a/database/seeders/DummySeeder.php +++ b/database/seeders/DummySeeder.php @@ -2,7 +2,9 @@ namespace Database\Seeders; +use App\Models\Setting; use Illuminate\Database\Seeder; +use Illuminate\Support\Str; class DummySeeder extends Seeder { @@ -13,6 +15,10 @@ class DummySeeder extends Seeder */ public function run() { - // + $settings = [ + ['id' => Str::ulid(), 'key' => 'app_name', 'value' => 'Customer Point', 'type' => 'text'], + ]; + + Setting::insert($settings); } } diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php index 50d22e9..5300234 100644 --- a/database/seeders/PermissionSeeder.php +++ b/database/seeders/PermissionSeeder.php @@ -30,6 +30,8 @@ class PermissionSeeder extends Seeder ['id' => Str::ulid(), 'label' => 'Update Role', 'name' => 'update-role'], ['id' => Str::ulid(), 'label' => 'View Role', 'name' => 'view-role'], ['id' => Str::ulid(), 'label' => 'Delete Role', 'name' => 'delete-role'], + + ['id' => Str::ulid(), 'label' => 'View Setting', 'name' => 'view-setting'], ]; foreach ($permissions as $permission) { diff --git a/resources/js/Components/Defaults/ApplicationLogo.jsx b/resources/js/Components/Defaults/ApplicationLogo.jsx index 08b4984..092d6da 100644 --- a/resources/js/Components/Defaults/ApplicationLogo.jsx +++ b/resources/js/Components/Defaults/ApplicationLogo.jsx @@ -1,7 +1,10 @@ -import React from 'react'; +import { usePage } from '@inertiajs/react' +import React from 'react' export default function ApplicationLogo({ className }) { - return ( -

App Name

- ); + const { + props: { app_name }, + } = usePage() + + return

{app_name}

} diff --git a/resources/js/Components/FormInput.jsx b/resources/js/Components/FormInput.jsx index 41073e8..483b005 100644 --- a/resources/js/Components/FormInput.jsx +++ b/resources/js/Components/FormInput.jsx @@ -1,11 +1,31 @@ -import React from "react"; -import Input from "./Input"; +import React from 'react' +import Input from './Input' -export default function FormInput({ type, name, onChange, value, label, className, error, autoComplete, autoFocus, placeholder, disabled, readOnly}) { +export default function FormInput({ + type, + name, + onChange, + value, + label, + className, + error, + autoComplete, + autoFocus, + placeholder, + disabled, + readOnly, +}) { + const id = `${name}-${label}` return (
- +
) -} \ No newline at end of file +} diff --git a/resources/js/Components/Input.jsx b/resources/js/Components/Input.jsx index 1e64a6a..4ae2795 100644 --- a/resources/js/Components/Input.jsx +++ b/resources/js/Components/Input.jsx @@ -1,24 +1,43 @@ import React from 'react' -export default function Input({ type = 'text', name, onChange, value, error = "", autoComplete = false, autoFocus = false, placeholder , className ,disabled, readOnly}) { +export default function Input({ + type = 'text', + name, + onChange, + value, + error = '', + autoComplete = false, + autoFocus = false, + placeholder, + className, + disabled, + readOnly, + id, +}) { return ( <> - {error && ( -

{error}

+

+ {error} +

)} - ) -} \ No newline at end of file +} diff --git a/resources/js/Layouts/Partials/SidebarNav.jsx b/resources/js/Layouts/Partials/SidebarNav.jsx index c7fb390..bff94df 100644 --- a/resources/js/Layouts/Partials/SidebarNav.jsx +++ b/resources/js/Layouts/Partials/SidebarNav.jsx @@ -1,21 +1,21 @@ -import React from 'react'; -import { router } from '@inertiajs/react'; -import { Sidebar } from 'flowbite-react'; -import { HiLogout } from 'react-icons/hi'; -import { filterOpenMenu } from './helpers'; -import routes from './routes'; -import { formatDate } from '@/utils'; +import React from 'react' +import { router } from '@inertiajs/react' +import { Sidebar } from 'flowbite-react' +import { HiLogout } from 'react-icons/hi' +import { filterOpenMenu } from './helpers' +import routes from './routes' +import { formatDate } from '@/utils' export default function SidebarNav({ user }) { - const menus = routes.filter(item => { + const menus = routes.filter((item) => { item.open = false if (!item.show) { return null } - if (+user.is_superadmin === 1) { + if (user.role === null) { return filterOpenMenu(user, item) } - if(user.role.permissions.find(p => p.name === item.permission)) { + if (user.role.permissions.find((p) => p.name === item.permission)) { return item } @@ -26,33 +26,36 @@ export default function SidebarNav({ user }) { - {menus.map(item => ( + {menus.map((item) => (
{item.items === undefined ? ( - router.visit(item.route)} - icon={item.icon} - active={route().current(item.active)} - > - {item.name} - + router.visit(item.route)} + icon={item.icon} + active={route().current(item.active)} + > + {item.name} + ) : ( - {item.items.map(item => ( - ( + router.visit(item.route)} + onClick={() => + router.visit(item.route) + } icon={item.icon} - active={route().current(item.active)} + active={route().current( + item.active + )} > {item.name} ))} - )}
@@ -64,10 +67,10 @@ export default function SidebarNav({ user }) { Logout
-

- App Name © {(new Date()).getFullYear()} +

+ App Name © {new Date().getFullYear()}

) -} \ No newline at end of file +} diff --git a/resources/js/Layouts/Partials/helpers.js b/resources/js/Layouts/Partials/helpers.js index 4450946..7a6fa74 100644 --- a/resources/js/Layouts/Partials/helpers.js +++ b/resources/js/Layouts/Partials/helpers.js @@ -1,21 +1,25 @@ export const filterOpenMenu = (user, item) => { - const isAdmin = +user.is_superadmin === 1 + const isAdmin = user.role === null if ('items' in item) { let items = [] if (isAdmin) { items = item.items } else { - items = item.items.filter(item => user.role.permissions.find(p => p.name === item.permission) ? item : null) + items = item.items.filter((item) => + user.role.permissions.find((p) => p.name === item.permission) + ? item + : null + ) } if (items.length > 0) { - let activeItem = items.map(item => route().current(item.active)) + let activeItem = items.map((item) => route().current(item.active)) item.open = activeItem.includes(true) - item.items = items.filter(item => item.show ? item : null) + item.items = items.filter((item) => (item.show ? item : null)) return item } } if (isAdmin) { return item } -} \ No newline at end of file +} diff --git a/resources/js/Layouts/Partials/routes.js b/resources/js/Layouts/Partials/routes.js index c4b349e..cab5b08 100644 --- a/resources/js/Layouts/Partials/routes.js +++ b/resources/js/Layouts/Partials/routes.js @@ -18,39 +18,47 @@ import { HiHome, HiInboxIn, HiOutlineCash, - HiOutlineTable -} from "react-icons/hi"; + HiOutlineTable, +} from 'react-icons/hi' export default [ { - name: "Dashboard", + name: 'Dashboard', show: true, icon: HiChartPie, - route: route("dashboard"), - active: "dashboard", - permission: "view-dashboard", + route: route('dashboard'), + active: 'dashboard', + permission: 'view-dashboard', }, { - name: "User", + name: 'User', show: true, icon: HiUser, items: [ { - name: "Roles", + name: 'Roles', show: true, icon: HiUserGroup, - route: route("roles.index"), - active: "roles.*", - permission: "view-role", + route: route('roles.index'), + active: 'roles.*', + permission: 'view-role', }, { - name: "Users", + name: 'Users', show: true, icon: HiUsers, - route: route("user.index"), - active: "user.index", - permission: "view-user", + route: route('user.index'), + active: 'user.index', + permission: 'view-user', }, ], }, -]; + { + name: 'Setting', + show: true, + icon: HiChartPie, + route: route('setting.index'), + active: 'setting.index', + permission: 'view-setting', + }, +] diff --git a/routes/auth.php b/routes/auth.php index 8b7f6bd..a126089 100644 --- a/routes/auth.php +++ b/routes/auth.php @@ -13,47 +13,47 @@ use Illuminate\Support\Facades\Route; Route::middleware('guest')->group(function () { Route::get('register', [RegisteredUserController::class, 'create']) - ->name('register'); + ->name('register'); Route::post('register', [RegisteredUserController::class, 'store']); Route::get('login', [AuthenticatedSessionController::class, 'create']) - ->name('login'); + ->name('login'); Route::post('login', [AuthenticatedSessionController::class, 'store']); Route::get('forgot-password', [PasswordResetLinkController::class, 'create']) - ->name('password.request'); + ->name('password.request'); Route::post('forgot-password', [PasswordResetLinkController::class, 'store']) - ->name('password.email'); + ->name('password.email'); Route::get('reset-password/{token}', [NewPasswordController::class, 'create']) - ->name('password.reset'); + ->name('password.reset'); Route::post('reset-password', [NewPasswordController::class, 'store']) - ->name('password.store'); + ->name('password.store'); }); Route::middleware('auth')->group(function () { Route::get('verify-email', [EmailVerificationPromptController::class, '__invoke']) - ->name('verification.notice'); + ->name('verification.notice'); Route::get('verify-email/{id}/{hash}', [VerifyEmailController::class, '__invoke']) - ->middleware(['signed', 'throttle:6,1']) - ->name('verification.verify'); + ->middleware(['signed', 'throttle:6,1']) + ->name('verification.verify'); Route::post('email/verification-notification', [EmailVerificationNotificationController::class, 'store']) - ->middleware('throttle:6,1') - ->name('verification.send'); + ->middleware('throttle:6,1') + ->name('verification.send'); Route::get('confirm-password', [ConfirmablePasswordController::class, 'show']) - ->name('password.confirm'); + ->name('password.confirm'); Route::post('confirm-password', [ConfirmablePasswordController::class, 'store']); Route::put('password', [PasswordController::class, 'update'])->name('password.update'); Route::post('logout', [AuthenticatedSessionController::class, 'destroy']) - ->name('logout'); + ->name('logout'); });