feat: Tambahkan fitur untuk menampilkan roles dan users

main
marszayn 2025-03-10 14:07:38 +07:00
parent 994496d1ba
commit d2102bfb5d
6 changed files with 189 additions and 6 deletions

View File

@ -27,13 +27,27 @@ class HandleInertiaRequests extends Middleware
*
* @return array<string, mixed>
*/
// public function share(Request $request): array
// {
// return [
// ...parent::share($request),
// 'auth' => [
// 'user' => $request->user(),
// ],
// ];
// }
public function share(Request $request): array
{
return [
...parent::share($request),
return array_merge(parent::share($request), [
'auth' => [
'user' => $request->user(),
'user' => $request->user() ? [
'id' => $request->user()->id,
'name' => $request->user()->name,
'permissions' => $request->user()->getPermissionArray(), // Kirim permissions
] : null,
],
];
]);
}
}

View File

@ -11,7 +11,7 @@ class RoleRequest extends FormRequest
*/
public function authorize(): bool
{
return false;
return true;
}
/**

View File

@ -46,4 +46,16 @@ class User extends Authenticatable /*implements MustVerifyEmail*/
'password' => 'hashed',
];
}
public function getPermissionArray()
{
return $this->getAllPermissions()->mapWithKeys(function ($permission) {
return [$permission->name => true];
})->toArray();
}
}

View File

@ -13,7 +13,6 @@ return Application::configure(basePath: dirname(__DIR__))
)
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\App\Http\Middleware\HandleInertiaRequests::class,
\Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class,
HandleInertiaRequests::class,
]);
@ -22,6 +21,7 @@ return Application::configure(basePath: dirname(__DIR__))
'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
//'auth' => \App\Http\Middleware\HandleInertiaRequests::class,//harus nya gini sih, karena di route nya lu pake middleware auth
]);
})
->withExceptions(function (Exceptions $exceptions) {

View File

@ -0,0 +1,157 @@
import AuthenticatedLayout from "@/layouts/authenticated-layout";
import { Head, usePage, router } from "@inertiajs/react";
import React, { useState } from "react";
import hasAnyPermission from "@/utils/hasAnyPermission";
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
import { Button } from "@/components/ui/button";
import Pagination from "@/components/pagination";
export default function RolesIndex() {
const { roles } = usePage().props;
const [dialogOpen, setDialogOpen] = useState(false);
const [roleToDelete, setRoleToDelete] = useState(null);
const handleDelete = (id) => {
setRoleToDelete(id);
setDialogOpen(true);
};
const confirmDelete = () => {
router.delete(`/admin/roles/${roleToDelete}`, {
onSuccess: () => {
setDialogOpen(false);
setRoleToDelete(null);
},
});
};
return (
<AuthenticatedLayout header="Kelompok Pengguna">
<Head title="Kelompok Pengguna" />
<div className="container mx-auto p-4">
<div className="row mb-3">
<div className="col-md-12">
<div className="d-flex justify-content-between align-items-center">
{hasAnyPermission(["Roles.index"]) && (
<Link
href="/admin/role/create"
className="btn btn-success"
>
<i className="bi bi-plus-circle-fill me-2"></i>
Add Role
</Link>
)}
</div>
</div>
</div>
<div className="card border rounded">
<div className="card-body p-0">
<div className="table-responsive p-4">
<table className="table align-middle">
<thead className="table-light">
<tr>
<th scope="col" className="text-center">
No.
</th>
<th scope="col">Role Name</th>
<th scope="col">Permissions</th>
<th scope="col" className="text-center">
Actions
</th>
</tr>
</thead>
<tbody>
{roles.data.map((role, index) => (
<tr key={role.id}>
<td className="text-center">
{index +
1 +
(roles.current_page - 1) *
roles.per_page}
</td>
<td>{role.name}</td>
<td>
<div className="d-flex flex-wrap gap-1">
{role.permissions.map(
(permission, i) => (
<span
key={i}
className="badge bg-success text-white badge-lg"
>
{
permission.name
}
</span>
)
)}
</div>
</td>
<td className="text-center">
{/* {hasAnyPermission([
"roles.edit",
]) && ( */}
<Link
href={`/admin/roles/${role.id}/edit`}
className="btn btn-primary btn-md me-2"
>
<i className="bi bi-pencil"></i>{" "}
Edit
</Link>
{/* )} */}
{/* {hasAnyPermission([
"roles.delete",
]) && ( */}
<button
onClick={() =>
handleDelete(role.id)
}
className="btn btn-danger btn-md"
>
<i className="bi bi-trash"></i>{" "}
Delete
</button>
{/* )} */}
</td>
</tr>
))}
</tbody>
</table>
</div>
<Pagination links={roles.links} />
</div>
</div>
</div>
<Dialog open={dialogOpen} onOpenChange={setDialogOpen}>
<DialogContent>
<DialogHeader>
<DialogTitle>Apakah Anda yakin?</DialogTitle>
<DialogDescription>
Data ini akan dihapus secara permanen!
</DialogDescription>
</DialogHeader>
<DialogFooter>
<Button
variant="outline"
onClick={() => setDialogOpen(false)}
>
Batal
</Button>
<Button variant="destructive" onClick={confirmDelete}>
Ya, hapus!
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</AuthenticatedLayout>
);
}