progress testing

This commit is contained in:
JokoPrasetio 2025-08-07 16:09:02 +07:00
parent 0d5e145adb
commit ce77b7b74e
22 changed files with 240 additions and 162 deletions

View File

@ -8,6 +8,7 @@ use App\Models\Karbohidrat;
use App\Models\Order;
use App\Models\OrderDetail;
use Carbon\Carbon;
use Carbon\CarbonPeriod;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
@ -28,39 +29,37 @@ class CustomerController extends Controller
$search = request('search');
$jenis_menu = request('jenis_menu');
$perPage = request()->get('per_page', 12);
$filters = explode(',', request('filters')); //
return self::menuOrder($search, $jenis_menu, $perPage, $filters);
$tanggal_awal = (int) request('tanggal_awal');
$tanggal_akhir = (int) request('tanggal_akhir');
return self::menuOrder($search, $jenis_menu, $perPage, $tanggal_awal, $tanggal_akhir);
}
private static function menuOrder($search = null, $jenis_menu = null, $perPage, $filters = [])
private static function menuOrder($search = null, $jenis_menu = null, $perPage, $tanggal_awal = null, $tanggal_akhir = null)
{
$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);
$payloadHari = [];
if (!empty($tanggal_awal) && !empty($tanggal_akhir)) {
if ($tanggal_awal > 0 && $tanggal_akhir >= $tanggal_awal) {
$payloadHari = range($tanggal_awal, $tanggal_akhir);
}
}
$payload = array_unique($payload);
// Step 1: Ambil menu_id yang sesuai tanggal
$menuIdTanggalValid = [];
if (!empty($payloadHari)) {
$menuIdTanggalValid = DB::connection('dbOrderGizi')
->table('public.detail_menu_paket_harian')
->whereIn('tgl_harian', $payloadHari)
->pluck('master_menu_id')
->unique()
->toArray();
// Jika tidak ada menu di tanggal tersebut, return kosong langsung
if (empty($menuIdTanggalValid)) {
return self::emptyMenuResponse($perPage);
}
}
// Step 2: Query menu
$menuQuery = DB::connection('dbOrderGizi')
->table('public.master_menu as mn')
->where('mn.statusenabled', true);
@ -73,38 +72,31 @@ 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);
});
if (!empty($menuIdTanggalValid)) {
$menuQuery->whereIn('mn.master_menu_id', $menuIdTanggalValid);
}
$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);
$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();
if (empty($menuIds)) {
return self::emptyMenuResponse($perPage);
}
// Step 3: Relasi data tambahan
$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')
@ -116,9 +108,6 @@ 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');
@ -129,8 +118,10 @@ class CustomerController extends Controller
->select('kmk.master_menu_id', 'k.kalori_id', 'k.nilai_kalori')
->get()
->groupBy('master_menu_id');
// Step 4: Transform response
$result = collect($paginated->items())->map(function ($menu) use ($klasifikasi, $dmph, $kkal) {
return [
'master_menu_id' => $menu->master_menu_id,
'nama' => $menu->nama_menu,
@ -152,7 +143,7 @@ class CustomerController extends Controller
})->values() : [],
'dmph' => isset($dmph[$menu->master_menu_id]) ? $dmph[$menu->master_menu_id]->map(function ($item) {
return [
'tgl_harian' => $item->tgl_harian,
'tgl_harian' => $item->tgl_harian
];
})->values() : [],
'kalori' => isset($kkal[$menu->master_menu_id]) ? $kkal[$menu->master_menu_id]->map(function ($item) {
@ -176,6 +167,22 @@ class CustomerController extends Controller
]);
}
private static function emptyMenuResponse($perPage)
{
return response()->json([
'status' => true,
'message' => 'Tidak ada menu ditemukan',
'data' => [
'data' => [],
'current_page' => 1,
'last_page' => 1,
'per_page' => $perPage,
'total' => 0,
]
]);
}
// paket do komen dulu
// private static function dataPaketMenuOrder($search = null, $perPage){

View File

@ -280,7 +280,7 @@ class MenuController extends Controller
'kmk.kalori_id',
'k.nilai_kalori'
)
->get()->groupBy('master_menu_id');
->orderBy('mn.entry_at', 'desc')->get()->groupBy('master_menu_id');
$grouped = $data->map(function($items){
$first = $items->first();

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -316,10 +316,10 @@ function renderCartSummary() {
${item.apakah_someday ? `` : `
<div class="col-12 col-md-3">
<select class="form-select form-select-sm karbohidrat-input" onchange="onKarbohidratChange(${item.id}, ${i})">
<option value="">Pilih Karbohidrat</option>
<option disabled selected>Pilih Karbohidrat</option>
${(karhohidrats || []).map(k => `
<option value="${k.karbohidrat_id}" ${p.karbohidrat_id === k.karbohidrat_id ? 'selected' : ''}>
${k.nama_karbohidrat} (${k.nilai_kalori} kkal)
${k.nama_karbohidrat} ${k.nilai_kalori ? `(${k.nilai_kalori} kkal)` : ''}
</option>
`).join('')}
</select>
@ -395,8 +395,7 @@ function renderCartSummary() {
const itemHTML = `
<div class="card mb-3 shadow-sm position-relative">
<div class="d-flex flex-column flex-md-row">
<button type="button" class="btn btn-sm btn-outline-danger position-absolute top-0 end-0 m-2"
onclick="removeCartItem(${item.id})">
<button type="button" class="btn btn-sm btn-outline-danger position-absolute top-0 end-0 m-2" onClick="removeCartItem(${item.id})" style="z-index:1;">
Hapus
</button>
<div class="p-2 d-flex justify-content-center align-items-center" style="flex: 0 0 300px;">
@ -421,14 +420,14 @@ function renderCartSummary() {
${item.kalori
? `<div class="mb-2 small text-muted"><i class="fa-solid fa-bolt me-1"></i> Kalori: <strong>${item.kalori} kkal</strong></div>`
: ''}
<div class="mb-2 small text-muted"><strong>Silakan isi tanggal pemesanan, catatan pemesanan (opsional) dan pilih karbohidrat yang diinginkan</strong></div>
<div class="mb-2 small text-muted"><strong>Silahkan isi tanggal pemesanan, pilih karbohidrat dan catatan pemesanan (opsional) yang diinginkan</strong></div>
${pesananHTML}
<div class="mt-3 d-flex justify-content-between align-items-center flex-wrap gap-2">
<button class="btn btn-sm btn-outline-success"
onclick="addOrderDate(${item.id}, ${item.apakah_menu_sore})">
+ Tambah Tanggal
</button>'
</button>
<div><strong>Total:</strong> <span class="text-success">Rp ${itemTotal.toLocaleString('id-ID')}</span></div>
</div>
@ -688,16 +687,17 @@ function initFlatpickrTersedia(item, i) {
const menitBatasFlat = 13 * 60;
const lewatBatasNormal = totalMenitFlatSekarang >= menitBatasFlat;
const tglString = Array.isArray(item?.tgl_tersedia)
? item?.tgl_tersedia.join(',') // kalau array → gabung jadi string
: String(item?.tgl_tersedia);
// Ambil string tgl_tersedia dan ubah jadi array tanggal lengkap
const dayNumbers = (item.tgl_tersedia || "")
const dayNumbers = (tglString || "")
.split(',')
.map(s => s.trim())
.filter(s => s !== '' && !isNaN(s))
.map(s => parseInt(s));
// Generate tanggal dalam format YYYY-MM-DD untuk 3 bulan ke depan
let availableDates = [];
const bulanKeDepan = 3;

View File

@ -99,8 +99,8 @@ function initSelectize(formElement) {
formElement.querySelectorAll('.money').forEach(input => {
input.addEventListener('input', function () {
let angka = this.value.replace(/[^0-9]/g, '');
this.value = formatAngka(angka);
let angka = this.value.replace(/[^0-9]/g, '');
this.value = formatAngka(angka);
});
});
@ -131,12 +131,27 @@ document.addEventListener('DOMContentLoaded', function () {
const money = document.querySelectorAll('.money')
money.forEach(input => {
input.addEventListener('input', function(){
let angka = this.value.replace(/[^0-9]/g, '');
this.value = formatAngka(angka)
})
})
input.addEventListener('input', function () {
// Simpan posisi kursor awal
let start = this.selectionStart;
console.log(start);
let end = this.selectionEnd;
// Ambil angka saja
let angka = this.value.replace(/[^0-9]/g, '');
let formatted = formatAngka(angka);
// Hitung perbedaan panjang string sebelum dan sesudah format
let selisih = formatted.length - this.value.length;
// Update value
this.value = formatted;
// Pulihkan posisi kursor (geser sesuai perubahan panjang)
this.setSelectionRange(start + selisih, end + selisih);
});
});
});
@ -362,9 +377,10 @@ function editMasterMenu(e) {
kalori: JSON.parse(decodeURIComponent(el.data('kalori') || '[]')),
kategori_diet: JSON.parse(decodeURIComponent(el.data('kategori_diet') || '[]')),
};
console.log(dataOld);
if(el.data('foto')){
document.getElementById('gambar_old').classList.remove('d-none')
document.getElementById('gambar_old').setAttribute('href', `/gambar/${el.data('foto')}`)
}
// Set value ke input form
$("#nama_edit").val(dataOld.nama_menu);
$("#harga_public_edit").val(dataOld.harga_public);

View File

@ -29,6 +29,7 @@
buttons += `
<button class="btn btn-sm btn-primary me-2" onclick="editMasterMenu(this)" data-master_menu_id="${row.master_menu_id}"
data-nama="${row?.nama_menu}"
data-foto="${row?.foto}"
data-harga_public="${row?.harga_public}"
data-harga_karyawan="${row?.harga_karyawan}"
data-jenis_menu="${row?.jenis_menu}"

View File

@ -7,7 +7,7 @@ $(document).ready(function(){
per_page: 12,
}
fetchMenu(filterState, getActiveFilters())
fetchMenu(filterState)
$('#tabJenisMenu .nav-link').on('click', function(e){
e.preventDefault();
@ -16,9 +16,12 @@ $(document).ready(function(){
$(this).closest('.nav-link').removeClass('text-black').addClass('active text-success');
datePicker.clear();
document.getElementById('tanggalTerpilihLabel').classList.add('d-none'); // Sembunyikan label
document.getElementById('tanggalTerpilihLabel').textContent = '';
document.getElementById('resetTanggal').classList.add('d-none');
filterState.jenis_menu = jenis
fetchMenu(filterState, getActiveFilters())
fetchMenu(filterState)
})
let searchTimout;
@ -28,7 +31,7 @@ $(document).ready(function(){
searchTimout = setTimeout(() => {
filterState.search = keyword;
fetchMenu(filterState, getActiveFilters())
fetchMenu(filterState)
}, 300)
})
})
@ -36,27 +39,6 @@ $(document).ready(function(){
function changePerPage(select) {
const newPerPage = parseInt(select.value);
filterState.per_page = newPerPage
fetchMenu(filterState, getActiveFilters())
fetchMenu(filterState)
}
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,10 +7,12 @@
function fetchMenu(filter = {}, activeFilters = []) {
function fetchMenu(filter = {}) {
const containerGuest = $("#order_guest_id");
$("#tanggal-filter").removeClass('d-none');
if(filter.jenis_menu === "konsultasi"){
$("#tanggal-filter").addClass('d-none');
const jadwalList = [
{
nama_dokter: "dr. Andi exp, Sp.A",
@ -54,19 +56,16 @@
}
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 || '',
filters: filter.filters
tanggal_awal: filter.tanggal_awal || '',
tanggal_akhir: filter.tanggal_akhir || '',
}).toString();
containerGuest.html('<p class="text-muted">Memuat data....</p>');
@ -98,14 +97,12 @@
`);
}
let html = '<div class="container"><div class="row row-cols-2 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-3">';
menus.forEach(menu => {
menus?.forEach(menu => {
html += `
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-2">
<div class="card h-100 shadow-sm p-2 rounded-4">
<div class="card h-100 shadow-sm p-2 rounded-4 mb-3">
<!-- Gambar Makanan -->
<img src="gambar/${menu.foto || '3.jpeg'}"
class="rounded shadow-sm object-fit-cover w-100" height="150px"

View File

@ -50,7 +50,7 @@
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-warning text-warning">
<div class="card-body">
<h5 class="card-title mb-1"><i class="bx bx-time-five me-1"></i> Belum Selesai</h5>
<h5 class="card-title mb-1"><i class="bx bx-time-five me-1"></i> Konfirmasi Pesanan</h5>
<h2 class="fw-bold mb-1" id="pesanan_waiting">8</h2>
<small>Menunggu Konfirmasi / Pembayaran</small>
</div>
@ -73,9 +73,9 @@
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-secondary text-secondary">
<div class="card-body">
<h5 class="card-title mb-1"><i class="bx bx-box me-1"></i> Pesanan Pending</h5>
<h5 class="card-title mb-1"><i class="bx bx-box me-1"></i>Pesanan Lunas, Menunggu Pengambilan</h5>
<h2 class="fw-bold mb-1" id="pesanan_belum_diambil">5</h2>
<small>Lunas tapi belum diambil</small>
<small>Pembayaran sudah lunas, namun pesanan belum diambil karena tanggal pengambilan belum sesuai. </small>
</div>
</div>
</div>
@ -83,9 +83,9 @@
<div class="col-md-4">
<div class="card border-0 shadow-sm bg-light-success text-success">
<div class="card-body">
<h5 class="card-title mb-1"><i class="bx bx-check-square me-1"></i> Pesanan Diambil</h5>
<h5 class="card-title mb-1"><i class="bx bx-check-square me-1"></i> Pesanan Selesai</h5>
<h2 class="fw-bold mb-1" id="pesanan_diambil">10</h2>
<small>Pemesan sudah ambil makanannya</small>
<small>Pemesan makanan sudah ambil</small>
</div>
</div>
</div>

View File

@ -66,7 +66,7 @@
<div class="col-md-12">
<div class="mb-3">
<label>Foto</label>
<label>Foto Produk</label>
<input type="file" name="data[0][foto]" accept="image/*" class="form-control" required>
</div>
</div>

View File

@ -59,8 +59,10 @@
<div class="col-md-12">
<div class="mb-3">
<label>Foto</label>
<label>Foto Produk</label>
<input type="file" name="foto" accept="image/*" class="form-control">
<a class="btn btn-sm btn-primary mt-2 d-none" id="gambar_old" target="_blank">Foto Produk Saat Ini</a><br/>
<small class="text-muted">Foto produk lama akan tetap digunakan jika Anda tidak mengunggah foto produk baru.</small>
</div>
</div>

View File

@ -61,16 +61,11 @@
<!-- Components -->
<li class="menu-header small text-uppercase"><span class="menu-header-text">Order</span></li>
<!-- Cards -->
<li class="menu-item {{ Request::is('dashboard/pekerjaan') ? 'active' : '' }}">
<a href="/dashboard/pekerjaan" class="menu-link">
<i class="menu-icon tf-icons bx bx-collection"></i>
<div data-i18n="Basic">Pekerjaan</div>
</a>
</li>
<li class="menu-item {{ Request::is('dashboard/pending') ? 'active' : '' }}">
<a href="/dashboard/pending" class="menu-link">
<i class="menu-icon tf-icons bx bx-collection"></i>
<div data-i18n="Basic">Pesanan Pending</div>
<div data-i18n="Basic">Konfirmasi Pesanan</div>
</a>
</li>
<!-- User interface -->
@ -80,5 +75,13 @@
<div data-i18n="User interface">Pesanan Selesai</div>
</a>
</li>
<li class="menu-header small text-uppercase"><span class="menu-header-text">Verifikasi Makanan</span></li>
<li class="menu-item {{ Request::is('dashboard/pekerjaan') ? 'active' : '' }}">
<a href="/dashboard/pekerjaan" class="menu-link">
<i class="menu-icon tf-icons bx bx-collection"></i>
<div data-i18n="Basic">Verifikasi Makanan</div>
</a>
</li>
</ul>
</aside>

View File

@ -4,7 +4,7 @@
<div class="container-xxl flex-grow-1 container-p-y">
<!-- Breadcrumb -->
<h4 class="fw-bold py-3 mb-4">
<span class="text-muted fw-light">Dashboard /</span> Pekerjaan
<span class="text-muted fw-light">Dashboard /</span> Verifikasi Makanan
</h4>
<!-- Card Master Menu -->
@ -12,14 +12,14 @@
<div class="card-header d-flex justify-content-between align-items-center flex-wrap gap-2">
<!-- Judul Kiri -->
<h5 class="mb-0">
Pekerjaan <strong id="confirm_pekerjaan_time"></strong>
Verifikasi Makanan <strong id="confirm_pekerjaan_time"></strong>
</h5>
<!-- Kanan: Tombol Export + Input Tanggal -->
<div class="d-flex align-items-center gap-2">
<!-- Tombol Export -->
<button type="button" class="btn btn-sm btn-primary" id="buttonLabel" onclick="labelDownload()" disabled>
<i class="fa-solid fa-qrcode"></i> Download Label
<i class="fa-solid fa-qrcode"></i> Cetak Label
</button>
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportPekerjaan()">
<i class="fa fa-download me-1"></i> Export

View File

@ -4,13 +4,13 @@
<div class="container-xxl flex-grow-1 container-p-y">
<!-- Breadcrumb -->
<h4 class="fw-bold py-3 mb-4">
<span class="text-muted fw-light">Dashboard /</span> Pesanan Pending
<span class="text-muted fw-light">Dashboard /</span> Konfirmasi Pesanan
</h4>
<!-- Card Master Menu -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">Pesanan Pending <strong id="confirm_date_pesanan_pending"></strong></h5>
<h5 class="mb-0">Konfirmasi Pesanan <strong id="confirm_date_pesanan_pending"></strong></h5>
<div class="d-flex align-items-center gap-2">
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="exportPending()">
<i class="fa fa-download me-1"></i> Export

View File

@ -83,7 +83,7 @@
<body>
<div class="header">
<h2>Laporan Pesanan Pending</h2>
<h2>Laporan Konfirmasi Pesanan</h2>
@if ($startDate === $endDate)
<div class="sub-title">Periode: {{ $startDate }}</div>
@else

View File

@ -19,35 +19,51 @@
</div>
</div>
</div>
<div class="row g-2 m-2">
<!-- Filter Kategori Ketersediaan -->
<div class="row ms-1" id="tanggal-filter">
<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 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>
<h6 class="fw-bold text-muted mb-1">
Pilih Tanggal Makanan
<a tabindex="0" class="ms-1 text-decoration-none" role="button" data-bs-toggle="popover" data-bs-trigger="focus"
title="Panduan"
data-bs-content="Pilih rentang tanggal untuk melihat daftar menu yang tersedia pada tanggal tersebut.">
<i class="fa fa-info-circle text-secondary"></i>
</a>
</h6>
<!-- Filter Kategori Menu -->
<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-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 class="input-group input-group-sm mb-2" style="max-width: 350px;">
<span class="input-group-text bg-white px-2">
<i class="fa fa-calendar-alt text-primary"></i>
</span>
<input type="text"
id="tanggal"
class="form-control form-control-sm tanggal-input"
readonly
placeholder="Contoh: 7 - 10 Agustus 2025"
title="Klik untuk membuka kalender"
style="font-size: 0.85rem; padding: 0.3rem 0.5rem;">
<!-- Tombol X di sebelah input -->
<button type="button" id="resetTanggal"
class="btn btn-sm btn-light border d-none"
title="Reset Tanggal">
<i class="fa fa-times text-muted"></i>
</button>
</div>
</div>
<div id="tanggalTerpilihLabel"
class="bg-light border text-dark mt-1 d-none rounded px-2 py-1"
style="font-size: 0.75rem; word-wrap: break-word; overflow-wrap: break-word;">
<i class="fa fa-calendar-check text-success me-1"></i>
<span id="labelTanggalText">Menampilkan menu...</span>
</div>
</div>
</div>
<div id="order_guest_id"></div>
<div id="floatingCartButton"
class="cart-floating bg-success text-white rounded d-none shadow-lg"
@ -73,4 +89,58 @@
<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>
<script>
const datePicker = flatpickr("#tanggal", {
dateFormat: "Y-m-d",
mode: "range",
onChange: function (selectedDates, dateStr) {
const label = document.getElementById('tanggalTerpilihLabel');
const resetBtn = document.getElementById('resetTanggal');
if (selectedDates.length === 2) {
const [start, end] = selectedDates;
const startDay = start.getDate();
const endDay = end.getDate();
if (start.getTime() === end.getTime()) {
label.textContent = `Menampilkan menu tersedia untuk tanggal: ${formatTanggal(start)}`;
} else {
label.textContent = `Menampilkan menu tersedia dari ${formatTanggal(start)} hingga ${formatTanggal(end)}`;
}
const activeFilter = document.querySelector('#tabJenisMenu .nav-link.active')?.dataset?.filter || null;
// Baru kirim ke fetchMenu jika dua tanggal sudah dipilih
fetchMenu({ jenis_menu: activeFilter, tanggal_awal: startDay, tanggal_akhir: endDay });
label.classList.remove('d-none');
resetBtn.classList.remove('d-none');
}
}
});
function formatTanggal(dateObj) {
const bulan = [
"Januari", "Februari", "Maret", "April", "Mei", "Juni",
"Juli", "Agustus", "September", "Oktober", "November", "Desember"
];
const d = dateObj.getDate();
const m = bulan[dateObj.getMonth()];
const y = dateObj.getFullYear();
return `${d} ${m} ${y}`;
}
document.addEventListener('DOMContentLoaded', function () {
document.querySelectorAll('[data-bs-toggle="popover"]').forEach(el => new bootstrap.Popover(el));
});
document.getElementById('resetTanggal').addEventListener('click', function() {
const activeFilter = document.querySelector('#tabJenisMenu .nav-link.active')?.dataset?.filter || null;
datePicker.clear(); // Reset tanggal
document.getElementById('tanggalTerpilihLabel').classList.add('d-none'); // Sembunyikan label
document.getElementById('tanggalTerpilihLabel').textContent = '';
document.getElementById('resetTanggal').classList.add('d-none');
fetchMenu({ jenis_menu: activeFilter, tanggal_awal: null, tanggal_akhir: null, });
});
</script>
@endsection