progress filter

This commit is contained in:
JokoPrasetio 2025-08-07 00:11:59 +07:00
parent 05ad717629
commit 0d5e145adb
4 changed files with 192 additions and 120 deletions

View File

@ -28,17 +28,43 @@ class CustomerController extends Controller
$search = request('search');
$jenis_menu = request('jenis_menu');
$perPage = request()->get('per_page', 12);
return self::menuOrder($search, $jenis_menu, $perPage);
$filters = explode(',', request('filters')); //
return self::menuOrder($search, $jenis_menu, $perPage, $filters);
}
private static function menuOrder($search = null, $jenis_menu = null, $perPage)
private static function menuOrder($search = null, $jenis_menu = null, $perPage, $filters = [])
{
// Step 1: Ambil ID menu sesuai filter
$filterCollection = collect($filters);
$includeSameday = $filterCollection->contains('someday');
$includeNormal = $filterCollection->contains('normal');
$menuMapping = [
'menu1' => ['1', '11', '21'],
'menu2' => ['2', '12', '22'],
'menu3' => ['3', '13', '23'],
'menu4' => ['4', '14', '24'],
'menu5' => ['5', '15', '25'],
'menu6' => ['6', '16', '26'],
'menu7' => ['7', '17', '27'],
'menu8' => ['8', '18', '28'],
'menu9' => ['9', '19', '29'],
'menu10' => ['10', '20', '30'],
'menu31' => ['31'],
];
$payload = [];
foreach ($menuMapping as $menuKey => $values) {
if ($filterCollection->contains($menuKey)) {
$payload = array_merge($payload, $values);
}
}
$payload = array_unique($payload);
$menuQuery = DB::connection('dbOrderGizi')
->table('public.master_menu as mn')
->where('mn.statusenabled', true);
if (!empty($jenis_menu)) {
$menuQuery->where('mn.jenis_menu', 'ILIKE', '%' . $jenis_menu . '%');
}
@ -47,6 +73,20 @@ class CustomerController extends Controller
$menuQuery->where('mn.nama_menu', 'ILIKE', '%' . $search . '%');
}
if ($includeSameday && !$includeNormal) {
$menuQuery->where('mn.apakah_someday', true);
} elseif (!$includeSameday && $includeNormal) {
$menuQuery->where('mn.apakah_someday', false);
}
if (!empty($payload)) {
$menuQuery->whereExists(function ($q) use ($payload) {
$q->select(DB::raw(1))
->from('public.detail_menu_paket_harian as dmph')
->whereRaw('dmph.master_menu_id = mn.master_menu_id')
->whereIn('dmph.tgl_harian', $payload);
});
}
$paginated = $menuQuery
->select(
'mn.master_menu_id',
@ -65,7 +105,6 @@ class CustomerController extends Controller
->paginate($perPage);
$menuIds = collect($paginated->items())->pluck('master_menu_id')->toArray();
// Step 2: Ambil semua klasifikasi untuk menu tersebut
$klasifikasi = DB::connection('dbOrderGizi')
->table('public.klasifikasi_menu_diet as kmd')
->join('public.kategori_diet as kd', 'kd.kategori_diet_id', '=', 'kmd.kategori_diet_id')
@ -77,10 +116,12 @@ class CustomerController extends Controller
$dmph = DB::connection('dbOrderGizi')
->table('public.detail_menu_paket_harian as dmph')
->whereIn('dmph.master_menu_id', $menuIds)
->when(!empty($payload), function ($query) use ($payload) {
$query->whereIn('dmph.tgl_harian', $payload);
})
->select('dmph.master_menu_id', 'dmph.tgl_harian')
->get()
->groupBy('master_menu_id');
$kkal = DB::connection('dbOrderGizi')
->table('public.klasifikasi_menu_kalori as kmk')
->join('public.kalori as k', 'k.kalori_id', 'kmk.kalori_id')
@ -88,7 +129,7 @@ class CustomerController extends Controller
->select('kmk.master_menu_id', 'k.kalori_id', 'k.nilai_kalori')
->get()
->groupBy('master_menu_id');
// Step 3: Gabungkan data menu + klasifikasi
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) {
return [
'master_menu_id' => $menu->master_menu_id,

View File

@ -7,7 +7,7 @@ $(document).ready(function(){
per_page: 12,
}
fetchMenu(filterState)
fetchMenu(filterState, getActiveFilters())
$('#tabJenisMenu .nav-link').on('click', function(e){
e.preventDefault();
@ -18,7 +18,7 @@ $(document).ready(function(){
filterState.jenis_menu = jenis
fetchMenu(filterState)
fetchMenu(filterState, getActiveFilters())
})
let searchTimout;
@ -28,7 +28,7 @@ $(document).ready(function(){
searchTimout = setTimeout(() => {
filterState.search = keyword;
fetchMenu(filterState)
fetchMenu(filterState, getActiveFilters())
}, 300)
})
})
@ -36,7 +36,27 @@ $(document).ready(function(){
function changePerPage(select) {
const newPerPage = parseInt(select.value);
filterState.per_page = newPerPage
fetchMenu(filterState)
fetchMenu(filterState, getActiveFilters())
}
const menuAvailable = document.getElementById('menu_available')
document.querySelectorAll('[data-filter-menu]').forEach(btn => {
btn.addEventListener('click', function(){
this.classList.toggle('active')
const normalBtns = document.querySelectorAll('[data-filter-menu="normal"]');
const normalIsActive = Array.from(normalBtns).some(btn => btn.classList.contains('active'));
if(normalIsActive){
menuAvailable.classList.remove('d-none')
}else{
menuAvailable.classList.add('d-none')
}
fetchMenu(filterState, getActiveFilters())
})
})
function getActiveFilters() {
return Array.from(document.querySelectorAll('[data-filter-menu].active'))
.map(btn => btn.dataset.filterMenu);
}

View File

@ -7,7 +7,7 @@
function fetchMenu(filter = {}) {
function fetchMenu(filter = {}, activeFilters = []) {
const containerGuest = $("#order_guest_id");
if(filter.jenis_menu === "konsultasi"){
@ -53,11 +53,18 @@
return containerGuest.html(html);
}
if (activeFilters.length > 0) {
filter.filters = activeFilters.join(',');
}
let params = new URLSearchParams({
page: filter.page || 1,
per_page: filter.per_page || 12,
search: filter.search || '',
jenis_menu: filter.jenis_menu || ''
jenis_menu: filter.jenis_menu || '',
filters: filter.filters
}).toString();
containerGuest.html('<p class="text-muted">Memuat data....</p>');

View File

@ -24,21 +24,26 @@
<div class="col-12 mb-2">
<h6 class="fw-bold text-muted">Ketersediaan Menu</h6>
<div class="d-flex flex-wrap gap-2">
<button type="button" class="btn btn-outline-success btn-sm" data-filter="someday">Tersedia Setiap Hari</button>
<button type="button" class="btn btn-outline-primary btn-sm" data-filter="normal">Tersedia di Tanggal Tertentu</button>
<button type="button" class="btn btn-outline-success btn-sm rounded" data-filter-menu="someday">Tersedia Setiap Hari</button>
<button type="button" class="btn btn-outline-primary btn-sm rounded" data-filter-menu="normal">Tersedia di Tanggal Tertentu</button>
</div>
</div>
<!-- Filter Kategori Menu -->
<div class="col-12 mt-3">
<h6 class="fw-bold text-muted">Kategori Menu</h6>
<div class="col-12 mt-3 d-none" id="menu_available">
<h6 class="fw-bold text-muted">Menu</h6>
<div class="d-flex flex-wrap gap-2">
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu1">Menu 1</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu2">Menu 2</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu3">Menu 3</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu4">Menu 4</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter="menu5">Menu 5</button>
<!-- dan seterusnya -->
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu1">Menu 1</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu2">Menu 2</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu3">Menu 3</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu4">Menu 4</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu5">Menu 5</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu6">Menu 6</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu7">Menu 7</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu8">Menu 8</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu9">Menu 9</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu10">Menu 10</button>
<button type="button" class="btn btn-outline-secondary btn-sm" data-filter-menu="menu31">Menu 31</button>
</div>
</div>
</div>
@ -68,5 +73,4 @@
<script src="{{ ver('/js/order_guest/register.js') }}"></script>
<script src="{{ ver('/js/order_guest/functions.js') }}"></script>
<script src="{{ ver('/js/order_guest/index.js') }}"></script>
@endsection