Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 166 additions & 0 deletions web-sch-12/app/Http/Controllers/admin/PermissionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
<?php
namespace App\Http\Controllers\admin;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Yajra\DataTables\Facades\DataTables;

class PermissionController extends Controller
{
public function index()
{
$permissions = Permission::with(['users', 'roles'])->get();
$users = User::all();
$roles = Role::all();
return view('admin.pages.Permissions.index', compact('permissions', 'users', 'roles'));
}

public function create()
{
$roles = Role::all();
return view('admin.pages.Permissions.create', compact('roles'));
}

public function store(Request $request)
{
$request->validate([
'name' => 'required|string|unique:permissions,name',
'roles' => 'nullable|array',
'roles.*' => 'exists:roles,id',
]);

$permission = Permission::create(['name' => $request->name]);

if ($request->filled('roles')) {
$roles = Role::whereIn('id', $request->roles)->get();
foreach ($roles as $role) {
$role->givePermissionTo($permission);
}
}

return redirect()->route('permissions.index')->with('success', 'Permission created.');
}

public function show(Permission $permission)
{
$users = User::all();
$roles = $permission->roles;
return view('admin.pages.Permissions.show', compact('permission', 'users', 'roles'));
}

public function edit(Permission $permission)
{
$roles = Role::all();
$assignedRoles = $permission->roles->pluck('id')->toArray();
return view('admin.pages.Permissions.edit', compact('permission', 'roles', 'assignedRoles'));
}

public function update(Request $request, Permission $permission)
{
$request->validate([
'name' => 'required|string|unique:permissions,name,' . $permission->id,
'roles' => 'nullable|array',
'roles.*' => 'exists:roles,id',
]);

$permission->update(['name' => $request->name]);

// Sinkronisasi ulang permission ke role
if ($request->filled('roles')) {
// Ambil semua role yang sebelumnya punya permission ini
$oldRoles = $permission->roles;
foreach ($oldRoles as $oldRole) {
$oldRole->revokePermissionTo($permission);
}

// Assign ke role baru
$newRoles = Role::whereIn('id', $request->roles)->get();
foreach ($newRoles as $role) {
$role->givePermissionTo($permission);
}
} else {
// Jika tidak ada role, revoke semuanya
foreach ($permission->roles as $role) {
$role->revokePermissionTo($permission);
}
}

return redirect()->route('permissions.index')->with('success', 'Permission updated.');
}

public function destroy(Permission $permission)
{
$permission->delete();

return redirect()->route('permissions.index')->with('success', 'Permission deleted.');
}

public function assignToUser(Request $request, Permission $permission)
{
$request->validate([
'user_id' => 'required|exists:users,id',
]);

$user = User::findOrFail($request->user_id);
$user->givePermissionTo($permission);

return back()->with('success', "Permission '{$permission->name}' assigned to user '{$user->name}'.");
}

public function revokeFromUser(Request $request, Permission $permission)
{
$request->validate([
'user_id' => 'required|exists:users,id',
]);

$user = User::findOrFail($request->user_id);
$user->revokePermissionTo($permission);

return back()->with('success', "Permission '{$permission->name}' revoked from user '{$user->name}'.");
}

public function assignToRole(Request $request, Permission $permission)
{
$request->validate([
'role_id' => 'required|exists:roles,id',
]);

$role = Role::findOrFail($request->role_id);
$role->givePermissionTo($permission);

return back()->with('success', "Permission '{$permission->name}' assigned to role '{$role->name}'.");
}

public function revokeFromRole(Request $request, Permission $permission)
{
$request->validate([
'role_id' => 'required|exists:roles,id',
]);

$role = Role::findOrFail($request->role_id);
$role->revokePermissionTo($permission);

return back()->with('success', "Permission '{$permission->name}' revoked from role '{$role->name}'.");
}
public function datatable(Request $request)
{
$permissions = Permission::with(['users', 'roles'])->select('permissions.*');

return DataTables::of($permissions)
->addIndexColumn()
->addColumn('assigned_users', fn($permission) => $permission->users->count() . ' user(s)')
->addColumn('roles', function ($permission) {
// return $permission->roles->map(fn($r) => '<span class="badge bg-secondary">' . $r->name . '</span>')->implode(' ');
return $permission->roles->map(fn($r) => '<span class="badge bg-secondary me-1 mb-1 d-inline-block">' . $r->name . '</span>')->implode('');

})
->addColumn('actions', function ($permission) {
return view('admin.pages.Permissions.partials.actions', compact('permission'))->render();
})
->rawColumns(['roles', 'actions']) // roles pakai HTML
->make(true);
}
}
15 changes: 15 additions & 0 deletions web-sch-12/app/Http/Controllers/admin/RoleController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace App\Http\Controllers\admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Spatie\Permission\Models\Role;

class RoleController extends Controller
{
public function list()
{
return Role::select(['id', 'name'])->get();
}
}
5 changes: 5 additions & 0 deletions web-sch-12/app/Http/Controllers/admin/UserController.php
Original file line number Diff line number Diff line change
Expand Up @@ -180,4 +180,9 @@ public function destroy($id)
->withErrors(['error' => 'Failed to delete user.']);
}
}
public function list()
{
return User::select(['id', 'name', 'email'])->get();
}

}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions web-sch-12/resources/views/admin/includes/scripts.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
<!--alert session-->
<script src="{{ asset('backend/assets/js/alert-session.js') }}"></script>

<!--data table responsive-->
<script src="https://cdn.datatables.net/responsive/2.5.0/js/dataTables.responsive.min.js"></script>

<script>
document.addEventListener('DOMContentLoaded', function() {
const themeToggle = document.getElementById('theme-toggle');
Expand Down
19 changes: 15 additions & 4 deletions web-sch-12/resources/views/admin/includes/sidebar.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -200,20 +200,31 @@
</li>

<!-- Administrasi -->
<li class="nav-item nav-item-has-children {{ request()->routeIs('users.*') ? 'show' : '' }}">
<a href="#0" class="{{ request()->routeIs('users.*') ? '' : 'collapsed' }}"
<li class="nav-item nav-item-has-children {{ request()->routeIs('users.*', 'permissions.*') ? 'show' : '' }}">
<a href="#0" class="{{ request()->routeIs('users.*', 'permissions.*') ? '' : 'collapsed' }}"
data-bs-toggle="collapse" data-bs-target="#ddmenu_13" aria-controls="ddmenu_13"
aria-expanded="{{ request()->routeIs('users.*') ? 'true' : 'false' }}" aria-label="Toggle navigation">
aria-expanded="{{ request()->routeIs('users.*', 'permissions.*') ? 'true' : 'false' }}"
aria-label="Toggle navigation">
<span class="icon"><i class="lni lni-cog"></i></span>
<span class="text">Administrasi</span>
</a>
<ul id="ddmenu_13" class="collapse dropdown-nav {{ request()->routeIs('users.*') ? 'show' : '' }}">
<ul id="ddmenu_13"
class="collapse dropdown-nav {{ request()->routeIs('users.*', 'permissions.*') ? 'show' : '' }}">
<li><a href="#">Pengaturan Sistem</a></li>

<li>
<a href="{{ route('users.index') }}" class="{{ request()->routeIs('users.*') ? 'active' : '' }}">
Manajemen User
</a>
</li>

<li>
<a href="{{ route('permissions.index') }}"
class="{{ request()->routeIs('permissions.*') ? 'active' : '' }}">
Manajemen Permission
</a>
</li>

<li><a href="#">Template Landing Page</a></li>
<li><a href="#">Integrasi API</a></li>
<li><a href="#">Backup Data</a></li>
Expand Down
6 changes: 6 additions & 0 deletions web-sch-12/resources/views/admin/includes/styles.blade.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css" rel="stylesheet">

<link rel="stylesheet" href="{{ asset('backend/assets/css/bootstrap.min.css') }}" />
<link rel="stylesheet" href="{{ asset('backend/assets/css/lineicons.css') }}" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="{{ asset('backend/assets/css/materialdesignicons.min.css') }}" rel="stylesheet"
Expand All @@ -18,6 +20,10 @@
<!--<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.5/css/jquery.dataTables.css">
<script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.11.5/js/jquery.dataTables.js"></script>-->

<!--data table responsive-->
<link rel="stylesheet" href="{{ asset('backend/assets/css/data-table.responsive.bootstrap5.min.css') }}">
<link rel="stylesheet" href="https://cdn.datatables.net/responsive/2.5.0/css/responsive.bootstrap5.min.css">

<style>
.sidebar {
transition: transform 0.3s ease;
Expand Down
4 changes: 4 additions & 0 deletions web-sch-12/resources/views/admin/layouts/app.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
<!-- ========== All CSS files linkup ========= -->
@include('admin.includes.styles')
<!-- ========== All CSS files linkup ========= -->
@stack('styles')

</head>

<body>
Expand Down Expand Up @@ -60,6 +62,8 @@
<script src="{{ asset('backend/assets/js/admin-common.js') }}"></script>
<!-- ========== admin common script ========== -->

@stack('scripts')

</body>

</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
@extends('admin.layouts.app')
@section('title', 'Create Permission')

@section('content')
<div class="container py-4">
<h4>Create Permission</h4>

<form action="{{ route('permissions.store') }}" method="POST">
@csrf

<div class="mb-3">
<label for="name" class="form-label">Permission Name</label>
<input type="text" class="form-control" id="name" name="name" placeholder="e.g. view_reports" required>
</div>

<div class="mb-3">
<label class="form-label">Assign to Roles</label>
<div class="row">
@foreach ($roles as $role)
<div class="col-md-3 col-6">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="roles[]" value="{{ $role->id }}" id="role_{{ $role->id }}">
<label class="form-check-label" for="role_{{ $role->id }}">
{{ $role->name }}
</label>
</div>
</div>
@endforeach
</div>
</div>

<button class="btn btn-success">Create</button>
<a href="{{ route('permissions.index') }}" class="btn btn-secondary">Cancel</a>
</form>
</div>
@endsection
38 changes: 38 additions & 0 deletions web-sch-12/resources/views/admin/pages/Permissions/edit.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
@extends('admin.layouts.app')
@section('title', 'Edit Permission')

@section('content')
<div class="container py-4">
<h4>Edit Permission</h4>

<form action="{{ route('permissions.update', $permission) }}" method="POST">
@csrf
@method('PUT')

<div class="mb-3">
<label for="name" class="form-label">Permission Name</label>
<input type="text" class="form-control" id="name" name="name" value="{{ $permission->name }}" required>
</div>

<div class="mb-3">
<label class="form-label">Assign to Roles</label>
<div class="row">
@foreach ($roles as $role)
<div class="col-md-3 col-6">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="roles[]" value="{{ $role->id }}"
id="role_{{ $role->id }}" {{ $permission->roles->contains($role->id) ? 'checked' : '' }}>
<label class="form-check-label" for="role_{{ $role->id }}">
{{ $role->name }}
</label>
</div>
</div>
@endforeach
</div>
</div>

<button class="btn btn-primary">Update</button>
<a href="{{ route('permissions.index') }}" class="btn btn-secondary">Cancel</a>
</form>
</div>
@endsection
Loading
Loading