fix sidebar permission user
This commit is contained in:
@@ -53,4 +53,11 @@ class User extends Authenticatable
|
||||
public function roles(){
|
||||
return $this->belongsToMany(Role::class, 'user_role')->withTimestamps();
|
||||
}
|
||||
|
||||
public function menus(){
|
||||
return Menu::whereHas('roles', function ($query){
|
||||
$query->whereIn('roles.id', $this->roles->pluck('id'))
|
||||
->where('role_menu.allow_show', true);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,21 +34,24 @@ class AppServiceProvider extends ServiceProvider
|
||||
{
|
||||
Blade::component('circle', Circle::class);
|
||||
|
||||
View::composer('layouts.partials.sidebar', function ($view){
|
||||
View::composer('layouts.partials.sidebar', function ($view) {
|
||||
$user = Auth::user();
|
||||
|
||||
if($user){
|
||||
$menus = Menu::whereHas('roles', function ($query) use ($user){
|
||||
$query->where('roles.id', $user->roles->pluck('id'));
|
||||
})
|
||||
->with(['children' => function ($query) {
|
||||
$query->whereHas('roles', function ($subQuery) {
|
||||
$subQuery->where('role_menu.allow_show', 1);
|
||||
});
|
||||
}])
|
||||
->orderBy('sort_order', 'asc')
|
||||
->get();
|
||||
}else{
|
||||
if ($user) {
|
||||
$menus = Menu::whereHas('roles', function ($query) use ($user) {
|
||||
$query->whereIn('roles.id', $user->roles->pluck('id'))
|
||||
->where('role_menu.allow_show', 1);
|
||||
})
|
||||
->with(['children' => function ($query) use ($user) {
|
||||
$query->whereHas('roles', function ($subQuery) use ($user) {
|
||||
$subQuery->whereIn('roles.id', $user->roles->pluck('id'))
|
||||
->where('role_menu.allow_show', 1);
|
||||
});
|
||||
}])
|
||||
->whereNull('parent_id') // Ambil hanya menu utama
|
||||
->orderBy('sort_order', 'asc')
|
||||
->get();
|
||||
} else {
|
||||
$menus = collect();
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ class RouteServiceProvider extends ServiceProvider
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public const HOME = '/dashboards/bigdata';
|
||||
public const HOME = '/home';
|
||||
|
||||
/**
|
||||
* Define your route model bindings, pattern filters, and other route configuration.
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -2,30 +2,6 @@ import bootstrap from "bootstrap/dist/js/bootstrap";
|
||||
window.bootstrap = bootstrap;
|
||||
import "iconify-icon";
|
||||
import "simplebar/dist/simplebar";
|
||||
// import flatpickr from "flatpickr";
|
||||
// import "flatpickr/dist/flatpickr.min.css";
|
||||
|
||||
// class InitDatePicker {
|
||||
// constructor(selector = ".datepicker") {
|
||||
// this.selector = selector;
|
||||
// }
|
||||
// init() {
|
||||
// const elements = document.querySelectorAll(this.selector);
|
||||
// if (elements.length === 0) return; // Skip if no elements found
|
||||
|
||||
// const today = new Date();
|
||||
// const minYear = today.getFullYear() - 5;
|
||||
|
||||
// elements.forEach((element) => {
|
||||
// flatpickr(element, {
|
||||
// enableTime: false,
|
||||
// dateFormat: "Y-m-d",
|
||||
// minDate: `${minYear}-01-01`,
|
||||
// maxDate: today,
|
||||
// });
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
|
||||
class Components {
|
||||
initBootstrapComponents() {
|
||||
@@ -131,7 +107,6 @@ class FormValidation {
|
||||
}
|
||||
document.addEventListener("DOMContentLoaded", function (e) {
|
||||
new Components().init(), new FormValidation().init();
|
||||
// new InitDatePicker().init();
|
||||
});
|
||||
class ThemeLayout {
|
||||
constructor() {
|
||||
|
||||
120
resources/scss/structure/_sidebar_custom.scss
Normal file
120
resources/scss/structure/_sidebar_custom.scss
Normal file
@@ -0,0 +1,120 @@
|
||||
//
|
||||
// sidebar_custom.scss
|
||||
//
|
||||
|
||||
.app-sidebar {
|
||||
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
|
||||
background-color: #f8f9fa; /* Warna sidebar putih */
|
||||
}
|
||||
|
||||
.logo-box {
|
||||
text-align: center;
|
||||
padding: 15px;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
/* Menu utama */
|
||||
.navbar-nav {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.menu-title {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
color: #6c757d;
|
||||
padding: 10px 15px;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
/* Parent Menu */
|
||||
.nav-item {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.nav-item > .nav-link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
color: #343a40;
|
||||
text-decoration: none;
|
||||
padding: 12px 20px;
|
||||
transition: background 0.3s ease-in-out, color 0.3s ease-in-out;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.nav-item > .nav-link:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
/* Ikon di sebelah kiri menu */
|
||||
.nav-icon {
|
||||
font-size: 20px;
|
||||
margin-right: 10px;
|
||||
color: #6c757d;
|
||||
}
|
||||
|
||||
/* CHILD MENU (Submenu) */
|
||||
.sub-navbar-nav {
|
||||
list-style: none;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
/* Menampilkan submenu ketika parent di-hover atau memiliki fokus */
|
||||
.nav-item:hover > .sub-navbar-nav,
|
||||
.nav-item:focus-within > .sub-navbar-nav {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Aturan untuk setiap submenu item */
|
||||
.sub-navbar-nav .nav-item {
|
||||
margin-left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.sub-navbar-nav .nav-link {
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
color: #6c757d;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 8px 15px;
|
||||
transition: color 0.3s ease-in-out, background 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
/* Hover effect untuk submenu */
|
||||
.sub-navbar-nav .nav-link:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
/* CHILD dari CHILD (Level lebih dalam) */
|
||||
.sub-navbar-nav .sub-navbar-nav {
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
/* Menampilkan submenu level dalam saat parent di-hover */
|
||||
.nav-item:hover > .sub-navbar-nav .nav-item:hover > .sub-navbar-nav {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Aturan tambahan untuk submenu anak-anak */
|
||||
.sub-navbar-nav .sub-navbar-nav .nav-link {
|
||||
font-size: 13px;
|
||||
color: #868e96;
|
||||
}
|
||||
|
||||
/* Ikon anak panah saat menu terbuka */
|
||||
.menu-arrow {
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
/* Efek putar ikon saat submenu terbuka */
|
||||
.nav-item:hover > .nav-link .menu-arrow,
|
||||
.nav-item:focus-within > .nav-link .menu-arrow {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
@@ -16,6 +16,7 @@
|
||||
@import "structure/general";
|
||||
@import "structure/topbar";
|
||||
@import "structure/sidebar";
|
||||
@import "structure/sidebar_custom";
|
||||
@import "structure/footer";
|
||||
@import "structure/page-title";
|
||||
|
||||
|
||||
@@ -1,396 +1,9 @@
|
||||
@extends('layouts.vertical', ['subtitle' => 'Dashboard'])
|
||||
@extends('layouts.vertical', ['subtitle' => 'Home'])
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('layouts.partials/page-title', ['title' => 'Home', 'subtitle' => 'Dashboard'])
|
||||
@include('layouts.partials/page-title', ['title' => 'Home', 'subtitle' => 'Home'])
|
||||
|
||||
<div class="row">
|
||||
<!-- Card 1 -->
|
||||
<div class="col-md-6 col-xl-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<p class="text-muted mb-0 text-truncate">Total Income</p>
|
||||
<h3 class="text-dark mt-2 mb-0">$78.8k</h3>
|
||||
</div>
|
||||
|
||||
<div class="col-6">
|
||||
<div class="ms-auto avatar-md bg-soft-primary rounded">
|
||||
<iconify-icon icon="solar:globus-outline"
|
||||
class="fs-32 avatar-title text-primary"></iconify-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="chart01"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card 2 -->
|
||||
<div class="col-md-6 col-xl-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<p class="text-muted mb-0 text-truncate">New Users</p>
|
||||
<h3 class="text-dark mt-2 mb-0">2,150</h3>
|
||||
</div>
|
||||
|
||||
<div class="col-6">
|
||||
<div class="ms-auto avatar-md bg-soft-primary rounded">
|
||||
<iconify-icon icon="solar:users-group-two-rounded-broken"
|
||||
class="fs-32 avatar-title text-primary"></iconify-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="chart02"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card 3 -->
|
||||
<div class="col-md-6 col-xl-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<p class="text-muted mb-0 text-truncate">Orders</p>
|
||||
<h3 class="text-dark mt-2 mb-0">1,784</h3>
|
||||
</div>
|
||||
|
||||
<div class="col-6">
|
||||
<div class="ms-auto avatar-md bg-soft-primary rounded">
|
||||
<iconify-icon icon="solar:cart-5-broken"
|
||||
class="fs-32 avatar-title text-primary"></iconify-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="chart03"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Card 4 -->
|
||||
<div class="col-md-6 col-xl-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<p class="text-muted mb-0 text-truncate">Conversion Rate</p>
|
||||
<h3 class="text-dark mt-2 mb-0">12.3%</h3>
|
||||
</div>
|
||||
|
||||
<div class="col-6">
|
||||
<div class="ms-auto avatar-md bg-soft-primary rounded">
|
||||
<iconify-icon icon="solar:pie-chart-2-broken"
|
||||
class="fs-32 avatar-title text-primary"></iconify-icon>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="chart04"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-4">
|
||||
<div class="card card-height-100">
|
||||
<div class="card-header d-flex align-items-center justify-content-between gap-2">
|
||||
<h4 class=" mb-0 flex-grow-1 mb-0">Revenue</h4>
|
||||
<div>
|
||||
<button type="button" class="btn btn-sm btn-outline-light">ALL</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-light">1M</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-light">6M</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-light active">1Y</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body pt-0">
|
||||
<div dir="ltr">
|
||||
<div id="dash-performance-chart" class="apex-charts"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div> <!-- end card-->
|
||||
</div> <!-- end col -->
|
||||
|
||||
<div class="col-lg-4">
|
||||
<div class="card card-height-100">
|
||||
<div class="card-header d-flex align-items-center justify-content-between gap-2">
|
||||
<h4 class="card-title flex-grow-1 mb-0">Sales By Category</h4>
|
||||
<div>
|
||||
<button type="button" class="btn btn-sm btn-outline-light">ALL</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-light">1M</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-light">6M</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-light active">1Y</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<div dir="ltr">
|
||||
<div id="conversions" class="apex-charts"></div>
|
||||
</div>
|
||||
<div class="table-responsive mb-n1 mt-2">
|
||||
<table class="table table-nowrap table-borderless table-sm table-centered mb-0">
|
||||
<thead class="bg-light bg-opacity-50 thead-sm">
|
||||
<tr>
|
||||
<th class="py-1">
|
||||
Category
|
||||
</th>
|
||||
<th class="py-1">Orders</th>
|
||||
<th class="py-1">Perc.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Grocery</td>
|
||||
<td>187,232</td>
|
||||
<td>
|
||||
48.63%
|
||||
<span class="badge badge-soft-success float-end">2.5% Up</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Electonics</td>
|
||||
<td>126,874</td>
|
||||
<td>
|
||||
36.08%
|
||||
<span class="badge badge-soft-success float-end">8.5% Up</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Other</td>
|
||||
<td>90,127</td>
|
||||
<td>
|
||||
23.41%
|
||||
<span class="badge badge-soft-danger float-end">10.98% Down</span>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- end table-responsive-->
|
||||
</div>
|
||||
|
||||
</div> <!-- end card-->
|
||||
</div> <!-- end col -->
|
||||
|
||||
<div class="col-lg-4">
|
||||
<div class="card">
|
||||
<div
|
||||
class="d-flex card-header justify-content-between align-items-center border-bottom border-dashed">
|
||||
<h4 class="card-title mb-0">Sessions by Country</h4>
|
||||
<div class="dropdown">
|
||||
<a href="#" class="dropdown-toggle btn btn-sm btn-outline-light"
|
||||
data-bs-toggle="dropdown" aria-expanded="false">
|
||||
View Data
|
||||
</a>
|
||||
<div class="dropdown-menu dropdown-menu-end">
|
||||
<!-- item-->
|
||||
<a href="javascript:void(0);" class="dropdown-item">Download</a>
|
||||
<!-- item-->
|
||||
<a href="javascript:void(0);" class="dropdown-item">Export</a>
|
||||
<!-- item-->
|
||||
<a href="javascript:void(0);" class="dropdown-item">Import</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body pt-0">
|
||||
<div id="world-map-markers" class="mt-3" style="height: 309px">
|
||||
</div>
|
||||
</div> <!-- end card-body-->
|
||||
|
||||
|
||||
</div> <!-- end card-->
|
||||
</div> <!-- end col-->
|
||||
|
||||
</div> <!-- End row -->
|
||||
|
||||
<div class="row">
|
||||
<div class="col-xl-6">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h4 class="card-title mb-0">New Accounts</h4>
|
||||
<a href="#!" class="btn btn-sm btn-light">
|
||||
View All
|
||||
</a>
|
||||
</div>
|
||||
<!-- end card-header-->
|
||||
|
||||
<div class="card-body pb-1">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0 table-centered">
|
||||
<thead>
|
||||
<th class="py-1">ID</th>
|
||||
<th class="py-1">Date</th>
|
||||
<th class="py-1">User</th>
|
||||
<th class="py-1">Account</th>
|
||||
<th class="py-1">Username</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>#US523</td>
|
||||
<td>24 April, 2024</td>
|
||||
<td>
|
||||
<img src="/images/users/avatar-2.jpg" alt="avatar-2"
|
||||
class="img-fluid avatar-xs rounded-circle" />
|
||||
<span class="align-middle ms-1">Dan Adrick</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-soft-success">Verified</span>
|
||||
</td>
|
||||
<td>@omions</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>#US652</td>
|
||||
<td>24 April, 2024</td>
|
||||
<td>
|
||||
<img src="/images/users/avatar-3.jpg" alt="avatar-2"
|
||||
class="img-fluid avatar-xs rounded-circle" />
|
||||
<span class="align-middle ms-1">Daniel Olsen</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-soft-success">Verified</span>
|
||||
</td>
|
||||
<td>@alliates</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>#US862</td>
|
||||
<td>20 April, 2024</td>
|
||||
<td>
|
||||
<img src="/images/users/avatar-4.jpg" alt="avatar-2"
|
||||
class="img-fluid avatar-xs rounded-circle" />
|
||||
<span class="align-middle ms-1">Jack Roldan</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-soft-warning">Pending</span>
|
||||
</td>
|
||||
<td>@griys</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>#US756</td>
|
||||
<td>18 April, 2024</td>
|
||||
<td>
|
||||
<img src="/images/users/avatar-5.jpg" alt="avatar-2"
|
||||
class="img-fluid avatar-xs rounded-circle" />
|
||||
<span class="align-middle ms-1">Betty Cox</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-soft-success">Verified</span>
|
||||
</td>
|
||||
<td>@reffon</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>#US420</td>
|
||||
<td>18 April, 2024</td>
|
||||
<td>
|
||||
<img src="/images/users/avatar-6.jpg" alt="avatar-2"
|
||||
class="img-fluid avatar-xs rounded-circle" />
|
||||
<span class="align-middle ms-1">Carlos
|
||||
Johnson</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="badge badge-soft-danger">Blocked</span>
|
||||
</td>
|
||||
<td>@bebo</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end card body -->
|
||||
</div>
|
||||
<!-- end card-->
|
||||
</div>
|
||||
<!-- end col -->
|
||||
|
||||
<div class="col-xl-6">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<h4 class="card-title mb-0">
|
||||
Recent Transactions
|
||||
</h4>
|
||||
|
||||
<a href="#!" class="btn btn-sm btn-light">
|
||||
View All
|
||||
</a>
|
||||
</div>
|
||||
<!-- end card-header-->
|
||||
|
||||
<div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover mb-0 table-centered">
|
||||
<thead>
|
||||
<th class="py-1">ID</th>
|
||||
<th class="py-1">Date</th>
|
||||
<th class="py-1">Amount</th>
|
||||
<th class="py-1">Status</th>
|
||||
<th class="py-1">
|
||||
Description
|
||||
</th>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>#98521</td>
|
||||
<td>24 April, 2024</td>
|
||||
<td>$120.55</td>
|
||||
<td>
|
||||
<span class="badge bg-success">Cr</span>
|
||||
</td>
|
||||
<td>Commisions</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>#20158</td>
|
||||
<td>24 April, 2024</td>
|
||||
<td>$9.68</td>
|
||||
<td>
|
||||
<span class="badge bg-success">Cr</span>
|
||||
</td>
|
||||
<td>Affiliates</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>#36589</td>
|
||||
<td>20 April, 2024</td>
|
||||
<td>$105.22</td>
|
||||
<td>
|
||||
<span class="badge bg-danger">Dr</span>
|
||||
</td>
|
||||
<td>Grocery</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>#95362</td>
|
||||
<td>18 April, 2024</td>
|
||||
<td>$80.59</td>
|
||||
<td>
|
||||
<span class="badge bg-success">Cr</span>
|
||||
</td>
|
||||
<td>Refunds</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>#75214</td>
|
||||
<td>18 April, 2024</td>
|
||||
<td>$750.95</td>
|
||||
<td>
|
||||
<span class="badge bg-danger">Dr</span>
|
||||
</td>
|
||||
<td>Bill Payments</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end card body -->
|
||||
</div>
|
||||
<!-- end card-->
|
||||
</div>
|
||||
<!-- end col -->
|
||||
</div>
|
||||
<!-- end row -->
|
||||
@endsection
|
||||
|
||||
@section('scripts')
|
||||
|
||||
@@ -14,49 +14,56 @@
|
||||
|
||||
<div class="scrollbar" data-simplebar>
|
||||
<ul class="navbar-nav" id="navbar-nav">
|
||||
<li class="menu-title">Menu</li>
|
||||
<li class="menu-title">Menu</li>
|
||||
|
||||
@php
|
||||
// Fungsi rekursif untuk menampilkan menu bertingkat dengan indentasi
|
||||
function renderMenu($menus, $depth = 0) {
|
||||
foreach ($menus as $menu) {
|
||||
$collapseId = "sidebar-" . $menu->id; // Unique ID untuk Bootstrap Collapse
|
||||
$hasChildren = $menu->children->count() > 0; // Cek apakah punya anak
|
||||
$marginLeft = $depth * 5; // Set jarak margin berdasarkan level
|
||||
@php
|
||||
function renderMenu($menus) {
|
||||
foreach ($menus as $menu) {
|
||||
$collapseId = "sidebar-" . $menu->id;
|
||||
$hasChildren = $menu->children->count() > 0;
|
||||
|
||||
echo '<li class="nav-item">';
|
||||
|
||||
// Menu utama / anak (dengan dropdown jika punya anak)
|
||||
echo '<a class="nav-link ' . ($hasChildren ? 'menu-arrow' : '') . '"
|
||||
href="' . ($hasChildren ? "#$collapseId" : ($menu->url ? (Route::has($menu->url) ? route($menu->url, ['menu_id' => $menu->id]) : $menu->url . '?menu_id=' . $menu->id) : '#')) . '"
|
||||
' . ($hasChildren ? 'data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="' . $collapseId . '"' : '') . '>
|
||||
<span class="nav-icon">
|
||||
<iconify-icon icon="' . $menu->icon . '"></iconify-icon>
|
||||
</span>
|
||||
<span class="nav-text">' . $menu->name . '</span>
|
||||
</a>';
|
||||
// Jika menu punya anak, buat sub-menu
|
||||
if ($hasChildren) {
|
||||
echo '<div class="collapse" id="' . $collapseId . '">
|
||||
<ul class="nav sub-navbar-nav">';
|
||||
renderMenu($menu->children, $depth + 1); // Rekursi dengan level lebih dalam
|
||||
echo '</ul></div>';
|
||||
}
|
||||
|
||||
echo '</li>';
|
||||
// Pastikan route tersedia dan boleh ditampilkan
|
||||
$menuUrl = '#';
|
||||
if ($menu->url) {
|
||||
if (Route::has($menu->url)) {
|
||||
$menuUrl = route($menu->url, ['menu_id' => $menu->id]);
|
||||
} else {
|
||||
$menuUrl = $menu->url . '?menu_id=' . $menu->id;
|
||||
}
|
||||
}
|
||||
@endphp
|
||||
|
||||
@php
|
||||
// Tampilkan hanya menu dengan parent_id NULL (menu utama)
|
||||
renderMenu($menus->where('parent_id', null));
|
||||
@endphp
|
||||
echo '<li class="nav-item ' . ($hasChildren ? 'has-children' : '') . '">';
|
||||
echo '<a class="nav-link ' . ($hasChildren ? 'menu-arrow' : '') . '"
|
||||
href="' . ($hasChildren ? "#$collapseId" : $menuUrl) . '"
|
||||
' . ($hasChildren ? 'data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="' . $collapseId . '"' : '') . '>';
|
||||
|
||||
// Tampilkan ikon hanya jika tersedia
|
||||
if (!empty($menu->icon)) {
|
||||
echo '<span class="nav-icon">
|
||||
<iconify-icon icon="' . $menu->icon . '"></iconify-icon>
|
||||
</span>';
|
||||
}
|
||||
|
||||
echo '<span class="nav-text">' . $menu->name . '</span>';
|
||||
echo '</a>';
|
||||
|
||||
if ($hasChildren) {
|
||||
echo '<div class="collapse" id="' . $collapseId . '">
|
||||
<ul class="nav sub-navbar-nav">';
|
||||
renderMenu($menu->children);
|
||||
echo '</ul></div>';
|
||||
}
|
||||
|
||||
echo '</li>';
|
||||
}
|
||||
}
|
||||
@endphp
|
||||
|
||||
@php renderMenu($menus); @endphp
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Efek Bintang -->
|
||||
<!-- Efek Bintang -->
|
||||
<div class="animated-stars">
|
||||
@for ($i = 0; $i < 20; $i++)
|
||||
|
||||
@@ -8,6 +8,7 @@ use App\Http\Controllers\Dashboards\PotentialsController;
|
||||
use App\Http\Controllers\DataSettingController;
|
||||
use App\Http\Controllers\Dashboards\BigDataController;
|
||||
use App\Http\Controllers\GoogleApisController;
|
||||
use App\Http\Controllers\Home\HomeController;
|
||||
use App\Http\Controllers\Master\UsersController;
|
||||
use App\Http\Controllers\MenusController;
|
||||
use App\Http\Controllers\RequestAssignment\PbgTaskController;
|
||||
@@ -29,6 +30,7 @@ require __DIR__ . '/auth.php';
|
||||
Route::group(['middleware' => 'auth'], function(){
|
||||
|
||||
Route::get('', [BigDataController::class, 'index'])->name('any');
|
||||
Route::get('/home', [HomeController::class, 'index']);
|
||||
|
||||
//dashboards
|
||||
Route::group(['prefix' => '/dashboards'], function(){
|
||||
|
||||
Reference in New Issue
Block a user