progress filter
This commit is contained in:
parent
05ad717629
commit
0d5e145adb
@ -28,112 +28,153 @@ 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
|
||||
$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 . '%');
|
||||
$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);
|
||||
}
|
||||
|
||||
if (!empty($search)) {
|
||||
$menuQuery->where('mn.nama_menu', 'ILIKE', '%' . $search . '%');
|
||||
}
|
||||
|
||||
$paginated = $menuQuery
|
||||
->select(
|
||||
'mn.master_menu_id',
|
||||
'mn.nama_menu',
|
||||
'mn.foto',
|
||||
'mn.jenis_menu',
|
||||
'mn.harga_public',
|
||||
'mn.harga_karyawan',
|
||||
'mn.harga_keluarga_pasien',
|
||||
'mn.status',
|
||||
'mn.deskripsi',
|
||||
'mn.apakah_someday',
|
||||
'mn.apakah_menu_siang',
|
||||
'mn.apakah_menu_sore',
|
||||
)
|
||||
->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')
|
||||
->whereIn('kmd.master_menu_id', $menuIds)
|
||||
->select('kmd.master_menu_id', 'kd.kategori_diet_id', 'kd.nama_kategori_diet')
|
||||
->get()
|
||||
->groupBy('master_menu_id');
|
||||
|
||||
$dmph = DB::connection('dbOrderGizi')
|
||||
->table('public.detail_menu_paket_harian as dmph')
|
||||
->whereIn('dmph.master_menu_id', $menuIds)
|
||||
->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')
|
||||
->whereIn('kmk.master_menu_id', $menuIds)
|
||||
->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,
|
||||
'nama' => $menu->nama_menu,
|
||||
'foto' => $menu->foto,
|
||||
'jenis_menu' => $menu->jenis_menu,
|
||||
'harga_public' => $menu->harga_public,
|
||||
'harga_karyawan' => $menu->harga_karyawan,
|
||||
'harga_keluarga_pasien' => $menu->harga_keluarga_pasien,
|
||||
'status' => $menu->status,
|
||||
'deskripsi' => $menu->deskripsi,
|
||||
'apakah_someday' => $menu->apakah_someday,
|
||||
'apakah_menu_sore' => $menu->apakah_menu_sore,
|
||||
'apakah_menu_siang' => $menu->apakah_menu_siang,
|
||||
'klasifikasiMenu' => isset($klasifikasi[$menu->master_menu_id]) ? $klasifikasi[$menu->master_menu_id]->map(function ($item) {
|
||||
return [
|
||||
'kategori_diet_id' => $item->kategori_diet_id,
|
||||
'nama_kategori_diet' => $item->nama_kategori_diet,
|
||||
];
|
||||
})->values() : [],
|
||||
'dmph' => isset($dmph[$menu->master_menu_id]) ? $dmph[$menu->master_menu_id]->map(function ($item) {
|
||||
return [
|
||||
'tgl_harian' => $item->tgl_harian,
|
||||
];
|
||||
})->values() : [],
|
||||
'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) {
|
||||
return [
|
||||
'nilai_kalori' => $item->nilai_kalori,
|
||||
];
|
||||
})->values() : [],
|
||||
];
|
||||
});
|
||||
|
||||
return response()->json([
|
||||
'status' => true,
|
||||
'message' => 'Berhasil mendapatkan data',
|
||||
'data' => [
|
||||
'data' => $result,
|
||||
'current_page' => $paginated->currentPage(),
|
||||
'last_page' => $paginated->lastPage(),
|
||||
'per_page' => $paginated->perPage(),
|
||||
'total' => $paginated->total(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
$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 . '%');
|
||||
}
|
||||
|
||||
if (!empty($search)) {
|
||||
$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',
|
||||
'mn.nama_menu',
|
||||
'mn.foto',
|
||||
'mn.jenis_menu',
|
||||
'mn.harga_public',
|
||||
'mn.harga_karyawan',
|
||||
'mn.harga_keluarga_pasien',
|
||||
'mn.status',
|
||||
'mn.deskripsi',
|
||||
'mn.apakah_someday',
|
||||
'mn.apakah_menu_siang',
|
||||
'mn.apakah_menu_sore',
|
||||
)
|
||||
->paginate($perPage);
|
||||
$menuIds = collect($paginated->items())->pluck('master_menu_id')->toArray();
|
||||
|
||||
$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')
|
||||
->whereIn('kmd.master_menu_id', $menuIds)
|
||||
->select('kmd.master_menu_id', 'kd.kategori_diet_id', 'kd.nama_kategori_diet')
|
||||
->get()
|
||||
->groupBy('master_menu_id');
|
||||
|
||||
$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')
|
||||
->whereIn('kmk.master_menu_id', $menuIds)
|
||||
->select('kmk.master_menu_id', 'k.kalori_id', 'k.nilai_kalori')
|
||||
->get()
|
||||
->groupBy('master_menu_id');
|
||||
|
||||
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) {
|
||||
return [
|
||||
'master_menu_id' => $menu->master_menu_id,
|
||||
'nama' => $menu->nama_menu,
|
||||
'foto' => $menu->foto,
|
||||
'jenis_menu' => $menu->jenis_menu,
|
||||
'harga_public' => $menu->harga_public,
|
||||
'harga_karyawan' => $menu->harga_karyawan,
|
||||
'harga_keluarga_pasien' => $menu->harga_keluarga_pasien,
|
||||
'status' => $menu->status,
|
||||
'deskripsi' => $menu->deskripsi,
|
||||
'apakah_someday' => $menu->apakah_someday,
|
||||
'apakah_menu_sore' => $menu->apakah_menu_sore,
|
||||
'apakah_menu_siang' => $menu->apakah_menu_siang,
|
||||
'klasifikasiMenu' => isset($klasifikasi[$menu->master_menu_id]) ? $klasifikasi[$menu->master_menu_id]->map(function ($item) {
|
||||
return [
|
||||
'kategori_diet_id' => $item->kategori_diet_id,
|
||||
'nama_kategori_diet' => $item->nama_kategori_diet,
|
||||
];
|
||||
})->values() : [],
|
||||
'dmph' => isset($dmph[$menu->master_menu_id]) ? $dmph[$menu->master_menu_id]->map(function ($item) {
|
||||
return [
|
||||
'tgl_harian' => $item->tgl_harian,
|
||||
];
|
||||
})->values() : [],
|
||||
'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) {
|
||||
return [
|
||||
'nilai_kalori' => $item->nilai_kalori,
|
||||
];
|
||||
})->values() : [],
|
||||
];
|
||||
});
|
||||
|
||||
return response()->json([
|
||||
'status' => true,
|
||||
'message' => 'Berhasil mendapatkan data',
|
||||
'data' => [
|
||||
'data' => $result,
|
||||
'current_page' => $paginated->currentPage(),
|
||||
'last_page' => $paginated->lastPage(),
|
||||
'per_page' => $paginated->perPage(),
|
||||
'total' => $paginated->total(),
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
// paket do komen dulu
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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>');
|
||||
|
||||
@ -19,26 +19,31 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-2 m-2">
|
||||
<div class="row g-2 m-2">
|
||||
<!-- Filter Kategori Ketersediaan -->
|
||||
<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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user